【问题标题】:Find duplicates in a list of lists with tuples在带有元组的列表列表中查找重复项
【发布时间】:2015-03-28 16:32:52
【问题描述】:

我试图在嵌套在列表中的元组中查找重复项。整个结构也是一个列表。如果有其他更好的方法来组织它以解决我的问题 - 我很高兴知道,因为这是我在此过程中构建的东西。

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

【问题讨论】:

    标签: python list python-2.7 python-3.x set


    【解决方案1】:

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

    太好了,那我们先把它转成字典吧:

    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]
    

    返回[[1,3],[2,4]]

    【讨论】:

    • 我在考虑使用defaultdict(set),然后在片场使用itertools.combinations 来获得所有这样的配对。例如,如果我们在pairList 中添加[5, (11, 12), (21, 22)] ,那么组合可以帮助我们返回[(1, 3), (1, 5), (2, 4), (2, 5), (4, 5) ]
    • 我的意思是 combinations(v, 2), v 来自最后一个列表理解。
    • @eumiro,这需要我很长时间才能解决,字典迭代器有点太高级了。该解决方案工作正常。我已将if len(v) == 2] 修改为if len(v) > 1],这样我就可以获得多个具有相同元组的情况的输出列表。很抱歉与“pairs”一词混淆 - 我只是不想让我的问题过于复杂。非常感谢。
    • @AlexTereshenkov - 我在== 2> 1 之间犹豫(甚至编辑),最后考虑了pairs 这个名字。很高兴向您展示了 dict 理解,您会喜欢使用它的。
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多