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

の 2 番目の引数groupbyは、反復可能な最初の引数からの連続する項目で呼び出される呼び出し可能オブジェクトです。

使用したいoperator.itemgetter('TravelReferenceDay')

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

これは と同等lambda x: x['TravelReferenceDay']です。

groupbyiterable はすでにキーでソートされていると想定していることに注意してください。グループには、同じキーを持つ隣接するアイテムが含まれます。

データを並列配列として保存したため、これは機能しません。処理を簡単にするために、辞書のリストに変換することをお勧めします。

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 に答える