python - 在包含元组的列表列表中查找重复项

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

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

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)。同样,list2 list4 有相同的元组(都有 (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

最佳答案

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

很好,那我们先把它转成字典:

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]]

关于python - 在包含元组的列表列表中查找重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28214895/

相关文章:

python - 使用 'max' 和 'len' 正确格式化列表的第 10 项

python - 将旧文件中已有换行符的行打印到新文件的同一行中

python - 如何将函数应用于元组元组中每个元组中特定位置的元素?

python - 在python中查找嵌套列表中元素的索引

c# - 在 C# 中混合列表<string>

c# - 您可以将派生类添加到其基类列表中,然后从 C# 中的基类列表中调用派生类的方法吗

java - 相同的方法调用,LinkedList、Queue 与 List 中的不同结果

Python 连接到 AWS EC2 中的 Teradata

python - 创建 1 种元素类型的列表的最佳实践方法是什么

python - 如何用模拟模拟只读属性?