过滤复杂列表中的元素

时间:2018-04-17 08:22:04

标签: python list dictionary

我有这个数据框

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

3 个答案:

答案 0 :(得分:2)

过滤列表的一种方法是将其拆分为由' 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})]

答案 1 :(得分:0)

使用groupby中的itertools

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]访问各个项目,但只有在之前已对数据进行排序时才能使用。

答案 2 :(得分:0)

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

有效的方式是通过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})]}