如果有这个元组列表:
l1 = [('aa', 1),('de', 1),('ac', 3),('ab', 2),('de', 2),('bc', 4)]
我想循环遍历它,并检查每个元组中的第二项是否与此列表中元组中的另一个第二项相同。如果是,我想把这个元组放在一个新的元组列表中。
所以从这个元组列表中我会期待我的新元组列表:
l2 = [('aa', 1), ('de', 1), ('ab', 2),('de', 2)]
因为一个和两个匹配。现在如果有这个:
l2 = []
for i in range(len(l1)):
if l1[i][1] in l1[:][0]:
l2.append(l1[i])
然而,这只给了我:
l2 = [('aa', 1), ('de', 1)]
我很确定我没有正确索引元组列表。解决方案可能很简单,但我只是没有到达那里。
答案 0 :(得分:3)
你需要两个传递:一个用于计算第二个元素存在的次数,另一个用于根据这些计数构建新列表:
from collections import Counter
counts = Counter(id_ for s, id_ in l1)
l2 = [(s, id_) for s, id_ in l1 if counts[id_] > 1]
演示:
>>> from collections import Counter
>>> l1 = [('aa', 1),('de', 1),('ac', 3),('ab', 2),('de', 2),('bc', 4)]
>>> counts = Counter(id_ for s, id_ in l1)
>>> [(s, id_) for s, id_ in l1 if counts[id_] > 1]
[('aa', 1), ('de', 1), ('ab', 2), ('de', 2)]
您的代码出错l1[:][0]
; l1[:]
只创建列表的浅层副本,然后从该列表中获取第一个元素。即使它有效,你的方法也必须检查列表中的每个其他元素你考虑的每个元组,这实际上是低效的(代码将采用N ** 2步骤来获得N元组的列表)。