【问题标题】:Python Filter List Items Relative to Each OtherPython过滤器列表项彼此相对
【发布时间】:2012-12-05 09:41:17
【问题描述】:

假设我有一个元组列表:

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

如果有更好的方法,请告诉我!谢谢。

【问题讨论】:

  • 结果出现的顺序重要吗?
  • 您的fruits 列表是否已按水果排序?
  • 是的,它已经按水果名称排序了,我希望结果按相同的顺序排列。

标签: python list filter filtering


【解决方案1】:

如果您的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))

【讨论】:

  • @Martjin Pieters——你的第二个函数语法似乎有点不正确(第二行),你没有使用 sortedfruits。
  • 您的第二个生成器在第二行缺少右括号。这似乎是最好的答案,并且有效!非常感谢!
【解决方案2】:
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)]

【讨论】:

    【解决方案3】:
    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()
    

    【讨论】:

      【解决方案4】:
           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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 2021-08-04
        • 1970-01-01
        相关资源
        最近更新 更多