2012-06-14 42 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 

我可以安排在CSV文件通過TravelReferenceDay的數據陣列的ID。我曾經嘗試過的方法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

是的,我應該有一個列表的清單嗎? – 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預計迭代已經按鍵排序;組包含相鄰的項目具有相同的密鑰。

好的,這不起作用,因爲你已經將數據存儲爲並行數組。爲了便於處理的我建議將其轉換爲類型的字典列表:

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

謝謝。我現在在「for k,g ...」行中得到「字符串索引必須是整數,而不是str」的錯誤。 – user578582

+0

是的,你的數據結構有點奇怪。見上面的評論。 – ecatmur