2012-03-30 132 views
0

變量或列表的名字,我想在多個具有以下結構的文本文件閱讀:避免變量在Python

3 560 
7 470 
2 680 
4 620 
3 640 
... 

第一列指定一個行爲實驗的條件下,第二列反應時間。我想要做的是爲每個條件創建一個數組/列表,只包含這個條件的反應時間。我以前使用過Perl。因爲有許多不同的條件,我想避免寫入許多單獨ELSIF陳述,因此在陣列名中使用的條件名稱:

push(@{condition.${cond}}, $rt); # $cond being the condition, $rt being the reaction time 

例如,在創建一個這樣的數組:

@condition3 = (560, 640,...); 

當我對Python感興趣時,我想看看如何使用Python來完成這個任務。我發現許多答案不鼓勵變量名稱中使用變量,但不得不承認,從這些答案中,我無法推導出如何按上述方式創建列表,而不會在每種情況下恢復爲單獨的elif。有沒有辦法做到這一點?任何建議將不勝感激!

托馬斯

+0

太好了!非常感謝您的快速和詳細的幫助!我還沒有意識到可以將附加值添加到字典中的現有密鑰,因爲迄今爲止我所見過的所有字典示例都只將關鍵字與單個值相關聯。 – Troas 2012-03-30 22:26:38

+1

詞典只爲每個鍵保存一個值,但該單個值可以是一個列表。 – kindall 2012-03-30 22:48:08

回答

4

的字典是這樣做的好方法。嘗試是這樣的:

from collections import defaultdict 

conditions = defaultdict(list) 

for cond, rt in data: 
    conditions[cond].append(rt) 
1

這是一本字典,它類似於一個Perl哈希一個完美的應用程序:

data = {} 
with open('data.txt') as f: 
    for line in f: 
     try: 
      condition, value = map(int, line.strip().split()) 
      data.setdefault(condition, []).append(value) 
     except Exception: 
      print 'Bad format for line' 

現在,您可以通過索引data訪問不同的條件:

>>> data 
{2: [680], 3: [560, 640], 4: [620], 7: [470]} 
>>> data[3] 
[560, 640] 
3

以下代碼用您所描述的格式讀取文件data.txt,並計算每個實驗的反應時間的字典:

 
experiments = {} 
with open('data.txt', 'r') as f: 
    data = [l.strip() for l in f.readlines()] 
for line in data: 
    index, value = line.split() 
    try: 
     experiments[int(index)].append(value) 
    except KeyError: 
     experiments[int(index)] = [value] 
print experiments 
# prints: {2: ['680'], 3: ['560', '640'], 4: ['620'], 7: ['470']} 

現在可以使用experiments[2]experiments[3],等等訪問每個實驗的反應時間。

1

我不確定你的問題,至於你爲什麼會考慮使用elif條件。

如果在字典中存儲整數列表,該鍵是第一列a.k.a條件值的值,其對應值是反應時間列表。

例如: 的字典是這樣的:

conditions['3'] -> [560, 640, ...]