繁体   English   中英

比较列表中的元组元素

[英]comparing elements of tuples in a list

我正在尝试编写一个比较每个元组的第二个元素并提取包含第二个元素重复项的元组的代码。

例如,如果我有

List = [(0, 2), (1, 0), (2, 1), (3, 2)]

duplicate_tuples = [(0, 2), (3, 2)]  # desired output

我只是不知道如何在我的迭代中指定第二个元素

for i in List: # would iterate each tuple
    if i[1] of i in List is duplicate...

缺乏Python语法令人沮丧。 我应该如何解决这个问题?

您可以在collections.defaultdict()收集元组,然后报告具有多个重复项的列表:

from collections import defaultdict

lst = [(0, 2), (1, 0), (2, 1), (3, 2), (2, 0)]

dups = defaultdict(list)
for fst, snd in lst:
   dups[snd].append((fst, snd))

print([v for k, v in dups.items() if len(v) > 1])
# [[(0, 2), (3, 2)], [(1, 0), (2, 0)]]

或者将重复项保留在字典中以便于查找:

print({k: v for k, v in dups.items() if len(v) > 1})
# {2: [(0, 2), (3, 2)], 0: [(1, 0), (2, 0)]}

在numpy数组中工作将比列表/元组有效。

import numpy as np
a = np.array([(0, 2), (1, 0), (2, 1), (3, 2),(3,0)])

unique_vals,inverse_indices,counts=np.unique(a[:,1],return_inverse=True,return_counts=True)

根据唯一函数的输出,我们可以生成重复列表

duplicates=[(i,a[inverse_indices==i]) for i  in unique_vals[np.where(counts>1)[0]]]

输出:

[(0, array([[1, 0],[3, 0]])),
 (2, array([[0, 2],[3, 2]]))]

可能会有更多重复项,因此groupby是更好的选择。

In [6]: from itertools import groupby
In [7]: for g,l in groupby(sorted(lst,key=lambda x:x[1]),key=lambda x:x[1]):
   ...:     temp = list(l)
   ...:     if len(temp) > 1:
   ...:         print g,temp
   ...:   
2 [(0, 2), (3, 2)]

这是使用numpy的另一种方法:

duplicate_list = []

foo = np.array([(0,2), (1,0), (2,1), (3,2), (3,0), (1,2)])

for i in range(len(np.unique(foo[:,1]))):
    if np.sum(foo[:,1] == i) > 1:
        duplicate_list.append(foo[foo[:,1] == i].tolist())

print(duplicate_list)

输出:

[[[1, 0], [3, 0]], [[0, 2], [3, 2], [1, 2]]]

使用np.unique(foo [:,1])我们获得一个元组中第二个元素的唯一元素,然后如果计数大于1或存在重复项,则将其追加到列表中,这将返回2个列表我们有2次出现(0和2)。 如果您有特定的数字,请说(2),那么我们可以避免循环。

例如

bla = np.array([(0, 2), (1, 0), (2, 1), (3, 2)])
duplicate = []

if np.sum(bla[:,1] == 2) > 1:
    duplicate = bla[bla[:,1] == 2].tolist()

print(duplicate)

输出:

[[0, 2], [3, 2]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM