根据python中的条件拆分列表字典

时间:2012-06-14 13:26:33

标签: python list dictionary

我有来自旅行日记的数据,这些数据已经从csv文件读入。我把它设置为带有一堆列表的字典。 E.g:

print diary['ID'][1] gives 123456789
print diary['TravelReferenceDay'][1] gives 1 for a Monday

我想根据日期从数组中随机选择一个ID:

random.choice(diary['ID']) if diary['TravelReferenceDay'] == 1

我可以通过TravelReferenceDay在csv文件中排列数据。我曾尝试使用groupby方法拆分数组:

groups = []
uniquekeys = []
for k, g in groupby(diary, diary['TravelReferenceDay']):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

但是这给出了错误:

TypeError: 'list' object is not callable

你能提出一个实现这个目标的方法吗?感谢。

2 个答案:

答案 0 :(得分:2)

groupby的第二个参数是一个可调用的函数,它在可迭代的第一个参数的连续项上调用。

您想使用operator.itemgetter('TravelReferenceDay')

for k, g in groupby(diary, operator.itemgetter('TravelReferenceDay')):
    ...

这相当于lambda x: x['TravelReferenceDay']

请注意groupby期望迭代已经按键排序;组包含具有相同键的相邻项。

好的,这不起作用,因为您已将数据存储为并行数组。为了便于处理,我建议将其转换为dicts列表:

diary = [dict((k, diary[k][i]) for k in diary) for i in range(len(diary['ID']))]

答案 1 :(得分:1)

我的解决方案有列表推导:

In [1]: import random
   ...: diary = {'ID': ['11', '22', '33', '44', '55'], 'TravelReferenceDay': [1, 1, 2, 3, 1]}
   ...: monday_diary = [x for n, x in enumerate(diary['ID']) if diary['TravelReferenceDay'][n] == 1]

In [2]: monday_diary
Out[2]: ['11', '22', '55']

In [3]: random.choice(monday_diary)
Out[3]: '22'