在包含元组的列表列表中查找重复项
Find duplicates in a list of lists with tuples
我试图在嵌套在列表中的元组中查找重复项。整个结构也是一个列表。如果有其他更好的方法来组织这个以解决我的问题 - 我很高兴知道,因为这是我在路上构建的东西。
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
,我想找出哪些列表具有相同的元组。所以我想报告 list1
与 list3
具有相同的元组(因为两者都有 (13,14)
。同样,list2
和 list4
具有相同的元组(两者有 (21,22)
) 并且需要报告。元组在列表中的位置无关紧要(list2
和 list4
都具有 (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
每个列表中的第一个元素唯一标识每个列表。
很好,那我们先转成dict:
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]]
.
我试图在嵌套在列表中的元组中查找重复项。整个结构也是一个列表。如果有其他更好的方法来组织这个以解决我的问题 - 我很高兴知道,因为这是我在路上构建的东西。
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
,我想找出哪些列表具有相同的元组。所以我想报告 list1
与 list3
具有相同的元组(因为两者都有 (13,14)
。同样,list2
和 list4
具有相同的元组(两者有 (21,22)
) 并且需要报告。元组在列表中的位置无关紧要(list2
和 list4
都具有 (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
每个列表中的第一个元素唯一标识每个列表。
很好,那我们先转成dict:
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]]
.