2011-02-14 119 views
0

SO,Python:附加到字典中的列表

有一個星期一的情況下,沒有我的引用幫助我。

我有格式化像這樣的文件:

x1 y1 z1 
x1 y2 z2 
x2 y3 z3 

我想作格式化這樣的字典:{X1:[Y1,Z1],[Y2,Z2],X2: y3,z3]}但我陷入了一個有效的方式來做到這一點。幫幫我?

+0

你不追加到映射。你追加(可變)序列。不要讓你的收藏混淆;) – delnan 2011-02-14 17:18:28

回答

4

我會說,你開始用繩子

data_str = """x1 y1 z1 
       x1 y2 z2 
       x2 y3 z3""" 

那麼你就必須

data_list = [d.split() for d in data_str.splitlines()] # [['x1', 'y1', 'z1'], ['x1', 'y2', 'z2'], ['x2', 'y3', 'z3']] 

然後創建一個defaultdict

from collections import defaultdict 
data_dict = defaultdict(list) 
for data_row in data_list: # E.g., data_row = ['x1', 'y1', 'z1'] 
    data_dict[data_row[0]].append(data_row[1:]) 
print data_dict # defaultdict(<type 'list'>, {'x2': [['y3', 'z3']], 'x1': [['y1', 'z1'], ['y2', 'z2']]}) 
1

你可以做這樣的事情:

def makeKeyValuePair(tokens): 
    return tokens[0], tokens[1:] 

print dict(makeKeyValuePair(line.rstrip().split()) for line in fileObject) 

它從創建鍵值對,而這又是從各行提取的字典。這當然假定x1,y1等不包含空格。

正如delnan指出的,根據您的使用情況,您可能會遇到重複密鑰的情況。這意味着你只能從該鍵的最後一行獲得值。要解決這個問題,人們可以使用defaultdict

from collections import defaultdict 
d = defaultdict(list) 

for line in fileObject: 
    tokens = line.rstrip().split() 
    d[tokens[0]].append(tokens[1:]) 
+0

不,這會覆蓋列表,如果密鑰出現多次。你需要一個`defaultdict`。 – delnan 2011-02-14 17:19:21

+0

@delnan:唯一鍵是我做的另一個假設......我將編輯以包含`defaultdict`解決方案。 – AndiDog 2011-02-14 17:22:29

+0

那麼,唯一的鍵明顯不是在OP的例子中的情況;) – delnan 2011-02-14 17:24:28

0
d={} 
for line in file: 
    split = line.strip().split(" ") 
    if not d.has_key(split[0]): d[split[0]] = [] 
    d[split[0]].append(split[1:]) 
0

你可以這樣做:

result = { } 
for line in lines: 
    terms = line.split() 
    result.setdefault(terms[0], []).append(terms[1:])