我有来自旅行日记的数据,这些数据已经从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
你能提出一个实现这个目标的方法吗?感谢。
答案 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'