0

我有从 csv 文件中读取的旅行日记的数据。我将它设置为带有一堆列表的字典。例如:

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

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

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

我可以在 csv 文件中按 TravelReferenceDay 排列数据。我曾尝试使用 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

你能建议一种方法来实现这一目标吗?谢谢。

4

2 回答 2

2

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

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

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

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

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

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

diary = [dict((k, diary[k][i]) for k in diary) for i in range(len(diary['ID']))]
于 2012-06-14T13:31:57.537 回答
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'
于 2012-06-14T13:43:42.163 回答