3

タプルのリストがあるとしましょう:

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)]

良い方法があれば教えてください!ありがとう。

4

4 に答える 4

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))
于 2012-12-18T08:03:38.450 に答える
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)]
于 2012-12-18T08:03:00.227 に答える
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()
于 2012-12-18T08:05:05.927 に答える
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)
于 2012-12-18T15:02:07.827 に答える