2012-06-14 3 views
0

У меня есть данные из дневников путешествия, которые были прочитаны из файла csv. Я создал его как словарь с кучей списков. Например .:Разделительный словарь списков на основе критериев в python

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

Я хочу randomnly выбрать идентификатор из массива на основе дня т.д .:

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 

Не могли бы вы предложить способ достижения этой цели? Благодарю.

+1

сохраняются данные в параллельных массивов? С этим работать будет нелегко. – ecatmur

+0

Да, должен ли я иметь список dicts? – user578582

ответ

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' 
+0

Это делает работу! – user578582

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']))] 
+0

Спасибо. Теперь я получаю сообщение об ошибке: «Строковые индексы должны быть целыми, а не str» в строке «для k, g ...». – user578582

+0

Да, ваши структуры данных немного странны. См. Комментарий выше. – ecatmur

Смежные вопросы