在一个包含元组的列表中查找重复项

3
我正在尝试在一个列表中找到嵌套元组中的重复项。整个结构也是一个列表。如果有其他更好的组织方式可以解决我的问题 - 我很乐意知道,因为这是我一路上建立的东西。
pairsList = [
                [1, (11, 12), (13, 14)], #list1
                [2, (21, 22), (23, 24)], #list2
                [3, (31, 32), (13, 14)], #list3
                [4, (43, 44), (21, 22)], #list4
               ]

每个列表中的第一个元素唯一地标识每个列表。
从对象“pairsList”中,我想找出哪些列表具有相同的元组。因此,我希望报告list1list3具有相同的元组(因为两者都有(13,14))。同样,list2list4具有相同的元组(都有(21,22)),需要报告。元组在列表中的位置并不重要(list2list4都有(13,14),尽管元组在列表中的位置不同)。
输出结果可以是任何可迭代的内容,例如(1,3),(2,4)[1,3],[2,4]。我感兴趣的是成对的列表。
我知道集合并在其他情况下使用它们删除列表中的重复项,但无法理解如何解决此问题。如果一个列表包含另一个列表中的任何元素,我可以像这样检查:
list1 = [1, (11, 12), (13, 14)]
list2 = [3, (31, 32), (13, 14)]
print not set(list1).isdisjoint(list2)
>>>True

以下代码让我知道哪些列表与第一个列表具有相同的元组。但是如何在所有列表上执行此操作的正确方法是什么?

counter = 0
for pair in pairsList:
    list0 = pairsList[0]
    iterList = pairsList[counter]
    if not set(list0).isdisjoint(iterList):
        print iterList[0] #print list ID
    counter += 1
1个回答

7

每个列表中的第一个元素唯一地标识了该列表。

好的,那么让我们首先将其转换为字典:

d = {x[0]: x[1:] for x in pairsList}

# d: 
{1: [(11, 12), (13, 14)],
 2: [(21, 22), (23, 24)],
 3: [(31, 32), (13, 14)],
 4: [(43, 44), (21, 22)]}

让我们对整个数据结构进行索引:

index = {}
for k, vv in d.iteritems():
    for v in vv:
        index.setdefault(v, []).append(k)

现在index的值为:
{(11, 12): [1],
 (13, 14): [1, 3],
 (21, 22): [2, 4],
 (23, 24): [2],
 (31, 32): [3],
 (43, 44): [4]}

输出结果可以是任何可迭代的东西,比如(1,3),(2,4)或[1,3],[2,4]。我感兴趣的是这些配对。

pairs = [v for v in index.itervalues() if len(v) == 2]

returns [[1,3],[2,4]].


我在考虑使用defaultdict(set),然后对集合使用itertools.combinations来获取所有这样的配对。例如,如果我们将[5, (11, 12), (21, 22)]添加到pairList中,那么组合可以帮助我们返回[(1, 3), (1, 5), (2, 4), (2, 5), (4, 5)] - Ashwini Chaudhary
我指的是最后一个列表推导式中的 v,并且是 combinations(v, 2) - Ashwini Chaudhary
@eumiro,这需要我花费很长时间来解决,使用字典迭代器有点过于高级了。解决方案很好用。我已经将“if len(v) == 2]”修改为“if len(v) > 1]”,这样我就可以得到输出列表,其中有多个相同元组的情况。对于“pairs”一词造成的混淆,我很抱歉——我只是不想让我的问题变得过于复杂。非常感谢。 - Alex Tereshenkov
@AlexTereshenkov - 我在 == 2> 1 之间犹豫了一下(甚至编辑了一下),最终考虑到了名称 pairs。很高兴向您展示了字典推导式,您会喜欢使用它的。 - eumiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接