我需要删除元组列表中的所有元组,除了那些彼此最接近的整数对。
例如,我有一个列表:
[(7, 36), (8, 36), (9, 36), (12, 36), (13, 37), (15, 37), (23, 37), (65, 78)]
我希望它看起来像这样:
[(12, 36), (23, 37), (65, 78)]
因此,第一个值必须是最大值或元组中两个数字之间的间隙必须是最小的,换句话说。问题是,我事先并不知道第一个数字,也不知道第二个数字。我也不知道附加了多少元组。
使用python3.5
UPD:非常感谢您的回答!编辑后,所有这些都很有效。
答案 0 :(得分:1)
我要用OrdereDict
:
在Python 2中,我会这样写:
>>> from collections import OrderedDict
>>> l = [(7, 36), (8, 36), (9, 36), (12, 36), (13, 37), (15, 37), (23, 37), (65, 78)]
>>>
>>> seen = OrderedDict()
>>> for first, second in l:
... if first > seen.get(second, None):
... seen[second] = first
...
>>> [(x, y) for y, x in seen.items()]
[(12, 36), (23, 37), (65, 78)]
请注意,所有内容都将大于None
的后备值seen.get
。
Python 3+解决方案,您无法将整数与None
进行比较:
>>> seen = OrderedDict()
>>> for first, second in l:
... if second not in seen or first > seen[second]:
... seen[second] = first
...
>>> [(x, y) for y, x in seen.items()]
[(12, 36), (23, 37), (65, 78)]
两种解决方案都不限于正整数元组。 运行时间为O(n),因为没有涉及O(n log(n))排序。
答案 1 :(得分:0)
为每个不同的第二个元素保留一个最大第一个元素的字典:
from collections import defaultdict
l = [(7, 36), (8, 36), (9, 36), (12, 36), (13, 37), (15, 37), (23, 37), (65, 78)]
d = defaultdict(lambda: -sys.maxsize) # assume very small default
for pair in l:
d[pair[1]] = max(d[pair[1]], pair[0])
result = sorted([(v, k) for k, v in d.iteritems()], key=lambda x: x[1]) # sort by second elements
print(result)
答案 2 :(得分:0)
首先,您可以创建一个跟踪最高值的字典。然后,从中创建一个排序列表:
highest = {}
for value, key in tuples:
highest[key] = max(highest.get(key, 0), value)
sorted_list = sorted((x[::-1] for x in highest.items()), key=lambda x: x[1])
答案 3 :(得分:0)
我根据第二项分割您的列表并使用最大的第一项检索元组:
copy()
答案 4 :(得分:0)
your_list=[(7, 36), (8, 36), (9, 36), (12, 36), (13, 37), (15, 37), (23, 37), (65, 78),(1, 36)]
adict={}
for v,k in your_list:
if not adict.get(k):
adict[k]=[v]
else:
adict[k].append(v)
#print(adict)
result=[(max(v),k) for k,v in adict.items()]
print(sorted(result))