【问题标题】:Get first two items from the first sublist if first element of the sublist is unique in Python如果子列表的第一个元素在 Python 中是唯一的,则从第一个子列表中获取前两项
【发布时间】:2020-11-03 03:19:53
【问题描述】:

我有一个清单:

df = [['apple', 'red', '0.2'], ['apple', 'green', '8.9'], ['apple', 'brown', '2.9'], 
      ['guava', 'green', '1.9'], ['guava', 'yellow', '4.9'], ['guava', 'light green', '2.3']]

鉴于第一个子列表的值是唯一的,我只想从第一个不同的子列表中获取前 2 个项目。

预期输出:

df = [['apple', 'red'], ['guava', 'green']]

到目前为止的代码:

dummy_list = []

for item in df:
    if item[0] not in dummy_list:        
        dummy_list.append(item[:2])

这不起作用并附加所有元素。请对此有任何帮助

【问题讨论】:

  • 如果您有另一个用于附加结果的列表(例如result_list),这将起作用。下面的setdefault 方法可能是最好的方法。

标签: python python-3.x list for-loop list-comprehension


【解决方案1】:

您可以使用defaultdict 使用键值对存储所有值,然后仅从该列表中选择第一个值。

from collections import defaultdict

df = [
    ["apple", "red", "0.2"],
    ["apple", "green", "8.9"],
    ["apple", "brown", "2.9"],
    ["guava", "green", "1.9"],
    ["guava", "yellow", "4.9"],
    ["guava", "light green", "2.3"],
]
temp = defaultdict(list)
for sub_list in df:
    temp[sub_list[0]].append(sub_list)

df = [value[0][:2] for _, value in temp.items()]

print(df)

输出:

[['apple', 'red'], ['guava', 'green']]

【讨论】:

    【解决方案2】:

    您可以使用itertools.groupby 并使用operator.itemgetter 作为密钥:

    from itertools import groupby
    from operator import itemgetter
    
    df = [['apple', 'red', '0.2'], ['apple', 'green', '8.9'], ['apple', 'brown', '2.9'], 
          ['guava', 'green', '1.9'], ['guava', 'yellow', '4.9'], ['guava', 'light green', '2.3']]
    
    df1 = [next(g)[:2] for k, g in groupby(df, key=itemgetter(0))]
    

    仅供参考 itemgetter(0)lambda x: x[0] 相同,因此您也可以使用它。

    【讨论】:

      【解决方案3】:

      当你说唯一的时候,你的意思是如果你选择了一个值,那么你就不想再选择它了吗?

      如果是这样,那么 pop 可能会有用:

      import random as r
      df = [['apple', 'red', '0.2'], ['apple', 'green', '8.9'], ['apple', 'brown', '2.9'], 
            ['guava', 'green', '1.9'], ['guava', 'yellow', '4.9'], ['guava', 'light green', '2.3']]
      
      total = len(df)
      
      targetdf = []
      
      for value in range(2):
          position = r.randint(0,total-1)
          targetdf.append(df.pop(position)[:2])
          total-=1
      
      #print(targetdf)
      
      #[['apple', 'green'], ['guava', 'yellow']]
      

      这段代码所做的是它在原始列表中选择一个随机位置,然后将其弹出。然后将该值保存到新列表中。

      【讨论】:

        【解决方案4】:

        或者更聪明:使用 dict 和 setdefault 仅为第一个添加映射

        result = {}
        for value in df:
            result.setdefault(value[0], value[:2])
        result = list(result.values())
        
        print(result)
        

        或者您可以保留添加键的计数以避免重复它们(在单独的列表中)

        keys = set()
        result = []
        for value in df:
            if value[0] not in keys:
                result.append(value[:2])
                keys.add(value[0])
        
        print(result) # [['apple', 'red'], ['guava', 'green']]
        

        【讨论】:

        • 这是setdefault 的绝佳用例。
        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 2017-11-05
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多