0

我有一个这样的清单:

[
('abilty', 'ability', 14, 1), 
('aand', 'wand', 14, 1), 
('aand', 'sand', 14, 1), 
('aand', 'land', 272, 1), 
('aand', 'hand', 817, 1), 
('aand', 'and', 38093, 1), 
('aand', 'band', 38093, 1), 
('aand', 'iand', 38093, 1), 
('aand', 'fand', 38093, 1)]

在这个单词列表中,如果有多个值(例如 aand 有 8 个匹配项),那么我想根据第三个属性对它们进行排序并选择第一个最高的值。例如在这个示例中,我的结果应该是

[
('abilty', 'ability', 14, 1),  
('aand', 'and', 38093, 1), 
]

我尝试了一些东西,但不幸的是它不起作用。你可以帮帮我吗 ?谢谢。

4

2 回答 2

2

首先对列表进行排序:

>>> new_lis = sorted(lis,key=lambda x : (x[0],x[2]),reverse = True) #lis is your list

>>> new_lis
[('abilty', 'ability', 14, 1), ('aand', 'and', 38093, 1), ('aand', 'band', 38093, 1), ('aand', 'iand', 38093, 1), ('aand', 'fand', 38093, 1), ('aand', 'hand', 817, 1), ('aand', 'land', 272, 1), ('aand', 'wand', 14, 1), ('aand', 'sand', 14, 1)]

现在每组只得到一个项目使用itertools.groupby

>>> from itertools import groupby
>>> [next(v) for k,v in groupby(new_lis,key=lambda x:x[0])]
[('abilty', 'ability', 14, 1), ('aand', 'and', 38093, 1)]

上述方法的总复杂度为O(NlogN)

你也可以collections.defauldict在这里使用,complexity O(N)

>>> from collections import defaultdict
>>> dic=defaultdict(list)
>>> for x in lis:
...     dic[x[0]].append(x)
...     
>>> [max(val,key=lambda x: x[2]) for val in dic.values()]
[('aand', 'and', 38093, 1), ('abilty', 'ability', 14, 1)]
于 2013-05-04T08:09:24.613 回答
0

itemgetter在本例中使用

>>> student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]

>>> from operator import itemgetter, attrgetter

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

对你来说

l=[
('abilty', 'ability', 14, 1), 
('aand', 'wand', 14, 1), 
('aand', 'sand', 14, 1), 
('aand', 'land', 272, 1), 
('aand', 'hand', 817, 1), 
('aand', 'and', 38093, 1), 
('aand', 'band', 38093, 1), 
('aand', 'iand', 38093, 1), 
('aand', 'fand', 38093, 1)]

from operator import itemgetter, attrgetter

sorted_l = sorted(sorted(l, key=itemgetter(0)), key=itemgetter(2), reverse = True)

s = ''

for x in sorted_l:
    if (x[0] != s):
        s = x[0]
        print x
于 2013-05-04T08:22:11.717 回答