我是python的新手,我在元组列表中有一个关于比较的问题。 我有一个列表与元组中的第二个元素的重复,我想只打印这个元组的第一个外观。 例如,对于此列表:
[(1, 2), (5, 10), (6, 10), (24, 35), (30, 35)]
我有这个功能:
def func(lst):
list_first = []
#Checks if 2 elements have the same second value.
for i in range(len(lst)-1):
if(lst[i][1] == lst[i+1][1]):
first = (lst[i][0]),lst[i][1]
list_first.append(first) #append only the first element
print list_first
我的功能输出是:
[(5, 10), (24, 35), (30, 35)]
但我的预期输出是:
[(5, 10), (24, 35)]
我该如何解决?
更新
我必须在列表列表上执行所有这些算法。 所以对于输入:
[[(0, 3), (1, 3), (2, 3), (3, 3), (4, 3)], [(5, 3), (6, 3), (7, 3), (8, 3), (9, 3)], [(10, 3), (11, 3), (12, 3), (13, 3), (14, 3)]]
我希望输出为:
[[(0, 3)], [(5, 3)], [(10, 3)]]
我尝试过改变我在这里的解决方案。 但我得到的只是:
[[(0, 3)], [(0, 3)], [(0, 3)]]
答案 0 :(得分:2)
使用groupby
模块中的itertools
解决您的问题的解决方案:
编辑:与@AKS建议的一样,这是一个具有多种输入形式的功能。
from itertools import groupby
def comp_list(a = list()):
final = []
for _, v in groupby(sorted(a, key = lambda x : x[1]) , lambda x : x[1]):
b = list(v)
if len(b) > 1:
final.append(b[0])
return final
a1 = [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35)]
a2 = [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35), (40, 35)]
a3 = [(5, 10), (24, 35), (30, 35), (20, 5), (15, 4), (21, 5), (13, 4)]
a4 = [(1, 2),(6, 10), (5, 10), (24, 35), (30, 35)]
print(comp_list(a1))
print(comp_list(a2))
print(comp_list(a3))
print(comp_list(a4))
输出:
[(5, 10), (24, 35)]
[(5, 10), (24, 35)]
[(15, 4), (20, 5), (24, 35)]
[(6, 10), (24, 35)]
答案 1 :(得分:2)
您可以使用使用元组中第二个值作为键的字典。
如果第二次出现此键,请将已经看到的元组附加到结果中。如果您看到元组三分之一或更长时间,请不要再次追加。
如果发现的次数超过两次,则集added
包含已添加的第二个元组条目:
from __future__ import print_function # makes work in Python 2 and 3
def find_first(lst):
seen = {}
res = []
added = set()
for elem in lst:
key = elem[1]
if key in seen and key not in added:
res.append(seen[key])
added.add(key)
else:
seen[key] = elem
return res
使用lis进行测试。请注意最后一个元素(60, 10)
,10
重复第三次:
L = [(1, 2), (5, 10), (6, 10), (24, 35), (30, 35), (60, 10)]
print(find_first(L))
输出:
[(5, 10), (24, 35)]
它 NOT 使用排序并适用于此示例数据:
L = [(1, 2), (6, 10), (5, 10), (24, 35), (30, 35), (60, 10)]
print(find_first(L))
输出:
[(6, 10), (24, 35)]
其他答案的解决方案不适用于此数据:
from itertools import groupby
L = [(1, 2), (6, 10), (5, 10), (24, 35), (30, 35), (60, 10)]
final = []
for _, v in groupby(sorted(a) , lambda x : x[1]):
b = list(v)
if len(b) > 1:
final.append(b[0])
print(final)
输出:
[(5, 10), (24, 35)]
答案 2 :(得分:0)
这是一个可以帮助你的小方法
def removeDuplicateTuple(sampleList):
uniqueList = []
entryLog = {}
processedEntries = []
for x, y in sampleList:
if entryLog.get(y)==None:
entryLog[y] = (x,y)
else:
if(entryLog.get(y) not in processedEntries):
uniqueList.append(entryLog.get(y))
processedEntries.append(entryLog.get(y))
return uniqueList
试验:
[(1, 2), (5, 10), (6, 10), (24, 35), (30, 35), (45, 2)]
输出:
[(5, 10), (24, 35), (1, 2)]