如何检查列表列表中的两个元组是否不相同

时间:2012-08-01 10:28:12

标签: python

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)]或任何其他元素多次出现,如何报告错误

2 个答案:

答案 0 :(得分:1)

使用set和loop;如果您之前看过一个元素,该集合将告诉您:

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

请注意,对于第二个列表中的可变元素,您希望首先将这些元素转换为非可变变体,例如元组:

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)

答案 1 :(得分:1)

如果您只想检测它,不能确切地看到哪些元素出现过多次,您可以这样做:

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

在第二个示例中,您需要在转换为集合之前将列表映射到元组:

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

如果您想知道每个项目发生了多少次,请使用python 2.7中引入的collections.Counter

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

同样,您必须先将lt22映射到tuple,然后才能使其正常工作。

如果你只需要一个列表项目不止一次出现,Martijns解决方案可能是该特定任务中效率最高的。