2012-12-18 44 views
3

比方說,我有一個元組列表:Python的篩選器列表項相互

fruits = [('apple','red',23), 
      ('apple','green',12), 
      ('orange','small',12), 
      ('orange','large',1)] 

我怎樣可以快速,乾淨地創建具有最大數字,但獨特的水果名稱的元組的新列表。所以理想的結果將是:

fruits = [('apple','red',23), 
      ('orange','small',12)] 

我目前的方法是這樣的:

def check_fruit(fruit, a_list): 
    for item in a_list: 
     if fruit[0] == item[0] and fruit[2] < item[2]: 
      return False 
    return True 
filtered_list = [fruit for fruit in fruits if check_fruit(fruit, fruits)] 

請讓我知道如果有一個更好的辦法!謝謝。

+2

是否順序的結果出現問題? – NPE

+3

你的'fruits'列表是否已經按水果分類? –

+1

是的,它已經按水果名稱排序了,我希望理想的結果是按照相同的順序。 – dougalg

回答

8

如果您fruits列表已經被水果排序,使用itertools.groupby

from itertools import groupby 
from operator import itemgetter 

def fruitfilter(fruits): 
    for fruit, group in groupby(fruits, key=itemgetter(0)): 
     yield max(group, key=itemgetter(2)) 

fruits = list(fruitfilter(fruits)) 

或簡稱無發電機:

[max(group, key=itemgetter(2)) for fruit, group in groupby(fruits, itemgetter(0))] 

但一世噸可能是你可以只使用發電機而不更換fruits批發。

否則使用sorted(fruits, key=(itemgetter(0), -itemgetter(2))並使用groupby抓住各組的第一個項目:

def fruitfilter(fruits): 
    sortedfruits = sorted(fruits, key=(itemgetter(0), -itemgetter(2))) 
    for fruit, group in groupby(sortedfruits, key=itemgetter(0)): 
     yield next(group) 

fruits = list(fruitfilter(fruits)) 
+1

@ Martjin Pieters - 你的第二個函數語法似乎有點不正確(第二行),並且你沒有使用已分類的水果。 – root

+0

@root:ack,c&p&忘記錯誤。謝謝! –

+0

您的第二個生成器在第二行缺少右括號。這似乎是最好的答案,並且有效!非常感謝! – dougalg

3
import itertools as it 

fruits = [('apple','red',23), 
      ('apple','green',12), 
      ('orange','small',12), 
      ('orange','large',1)] 

uniq_max = [next(v) for k,v in it.groupby(sorted(fruits, key=lambda x:(x[0], -x[2])), key=lambda x:x[0])] 

回報

[('apple', 'red', 23), ('orange', 'small', 12)] 
0
f = {} 
for item in fruits: 
    if item[0] not in f or item[2] > f[item[0]][2]: 
     f[item[0]] = item 

filtered_list = f.values() 
0
 python 3.2 
    from itertools import groupby 

1. [max(v,key=lambda x:x[2])for _,v in groupby(fruits,key=lambda x:x[0])] 

而不itertools GROUPBY功能:

2. [max([(f,c,n) for f,c,n in fruit if f==k],key=lambda x:x[2]) 
             for k in set([i[0] for i in fruit])] 


    3. [max([i for i in fruit if i[0]==v],key=lambda x:x[2]) for v in set(k[0]for k in fruit)] 


    4. loop method 

    newlist=[] 
    newset=set(i[0] for i in fruit) 
    for i in newset: 
     t=(0,0,0) 
     for l in fruit: 
      if i==l[0] and l[2]>t[2]: 
        t=l 
     d.append(t)