在元组列表中删除除整数之间间隔最小的元组之外的所有元组

时间:2016-03-12 21:28:03

标签: python list tuples

我需要删除元组列表中的所有元组,除了那些彼此最接近的整数对。

例如,我有一个列表:

[(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:非常感谢您的回答!编辑后,所有这些都很有效。

5 个答案:

答案 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))