0
lt1 = [(1, 1), (1, 1), (1, 5), (1, 4), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2)]

上記のリストの(1,1)または他のタプルが複数回発生した場合、エラーを報告するにはどうすればよいですか?

リストについても同様です

lt22 = [['a', (1,1)], ['a', (1,2)], ['a', (1,2)], ['a', (1,3)], ['b', (2,1)], ['b', (2,2)], ['b', (2,2)]]

['a'、(1,2)]またはその他の要素が複数回発生した場合にエラーを報告する方法

4

2 に答える 2

1

セットとループを使用します。セットは、以前に要素を見たことがあるかどうかを通知します。

seen = set()
for el in lt1:
    if el in seen:
        raise ValueError, 'More than one %r in your list' % (el,)
    seen.add(el)

2番目のリストにあるような可変要素の場合、最初にこれらをタプルなどの非可変バリアントに変換する必要があることに注意してください。

seen = set()
for el in lt22:
    el = tuple(el)
    if el in seen:
        raise ValueError, 'More than one %r in your list' % (el,)
    seen.add(el)
于 2012-08-01T10:31:10.967 に答える
1

それを検出したいだけで、どの要素が複数回発生するかを正確に確認したくない場合は、次のようにします。

if len(lt1) != len(set(lt1)):
    # Not all unique

2 番目の例では、セットに変換する前にリストをタプルにマップする必要があります。

if len(lt22) != len(set(map(tuple, lt22))):
    # Not all unique

各アイテムが何回発生したかを知りたい場合はcollections.Counter、python 2.7 で導入された を使用します。

>>> from collections import Counter
>>> {k: d for k, d in Counter(lt1).items() if d > 1}
{(1, 1): 2}

繰り返しますが、それを機能させるには、使用する前ににマップlt22する必要があります。tuple

どのアイテムが複数回出現するかのリストが必要な場合は、Martijns ソリューションがおそらくその特定のタスクで最も効率的です。

于 2012-08-01T10:34:17.493 に答える