【问题标题】:filter elements in complex list过滤复杂列表中的元素
【发布时间】:2018-04-17 08:22:03
【问题描述】:

我有这个数据框

df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]

我想要这样的

df2=[('f', {'abe': 1}), ('f', {'tbeli': 1})]

df3=[('g', {'mos': 1}), ('g', {'esc': 1})]

我试过这段代码

L1 = [year for (title, year) in (sorted(df1.items(), key=lambda t: t[0]))]

【问题讨论】:

  • 项目是否分组?你可以使用itertools.groupby
  • 如果以下解决方案之一解决了您的问题,请考虑接受(左侧绿色勾号),或随时要求澄清。

标签: python list dictionary


【解决方案1】:

过滤列表的一种方法是将其拆分为由“f”或“g”索引的子列表:

from collections import defaultdict

df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]

df = defaultdict(list)

for item in df1:
    df[item[0]].append(item)

df2 = df['f']
df3 = df['g']

print(df2)
print(df3)

输出:

[('f', {'abe': 1}), ('f', {'tbeli': 1})]
[('g', {'mos': 1}), ('g', {'esc': 1})]

【讨论】:

    【解决方案2】:

    使用来自itertoolsgroupby

    from itertools import groupby
    
    df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]
    
    splitted = [list(v) for k, v in groupby(df1, key = lambda x: x[0])]
    print(splitted)
    


    这产生
    [[('f', {'abe': 1}), ('f', {'tbeli': 1})], [('g', {'mos': 1}), ('g', {'esc': 1})]]
    

    之后您可以通过splitted[0] 访问各个项目,但它仅在数据之前已排序时才有效。

    【讨论】:

      【解决方案3】:

      您应该为可变数量的变量使用字典。

      有效的方法是通过collections.defaultdict,如@quamrana's solution 所示,但这也可以通过字典推导中的列表推导实现。

      df1 = [('f', {'abe': 1}), ('f', {'tbeli': 1}), ('g', {'mos': 1}), ('g', {'esc': 1})]
      
      res = {i: [x for x in df1 if x[0]==i] for i, j in df1}
      
      # {'f': [('f', {'abe': 1}), ('f', {'tbeli': 1})],
      #  'g': [('g', {'mos': 1}), ('g', {'esc': 1})]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-20
        • 2015-12-13
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多