2016-11-11 51 views
2

我覺得它是基本的東西,但不知何故,我不明白它。我想循環一個列表並將所有人附加到相同的ID。或寫入文件,沒關係。python雖然id是相同的做點什麼

[1, 'Smith'] 
[1, 'Black'] 
[1, 'Mueller'] 
[2, 'Green'] 
[2, 'Adams'] 

[1; 'Smith', 'Black', 'Mueller'] 
[2; 'Green', 'Adams'] 

首先,我創建的所有ID的列表,然後我有兩個for循環是這樣的:

final_doc = [] 
for id in all_ids: 
    persons = [] 
    for line in doc: 
     if line[0] == id: 
      persons.append(line[1]) 
    final_doc.append(id, persons) 

它需要年齡。我試圖創建一個帶有ID的字典,然後以某種方式將它結合起來,但字典只有一次使用相同的ID(可能我在那裏做了一些不像我應該有的)。現在我正在考慮使用while循環。雖然id​​仍然是追加的人。但是,如果它必須是,例如,當id小於25時,很容易理解如何去做。但在「雖然它是相同的」情況下,我不知道該怎麼做。任何想法都非常感激。

+0

一方面:'如果線[0] = ID:'是分配。我想你想測試是否相等:'if line [0] == id:'。 –

+0

名稱和ID是否存儲在列表中?也就是說[[1,smith],[1,black] ...]'? – LMc

+0

@JohnnyMopp是的,當然,謝謝! – student

回答

4

您可以將它們組合在一起字典中。

鑑於

lists = [[1, 'Smith'], 
     [1, 'Black'], 
     [1, 'Mueller'], 
     [2, 'Green'], 
     [2, 'Adams'] ] 

d = {} 
for person_id, name in lists: 
    d.setdefault(person_id, []).append(name) 

d現在包含

{1: ['Smith', 'Black', 'Mueller'], 2: ['Green', 'Adams']} 

注:

d.setdefault(person_id, []).append(name) 

if person_id not in d: 
    d[person_id] = [] 
d[person_id].append(name) 

如果你喜歡你的答案是,在列表中爲person_id作爲第一個項目(如暗示你的問題),更改代碼清單列表的快捷方式

d = {} 
for person_id, name in lists: 
    d.setdefault(person_id, [person_id]).append(name) # note [person_id] default 
result = list(d.values()) # omit call to list if on Python 2.x 

result包含

[[1, 'Smith', 'Black', 'Mueller'], [2, 'Green', 'Adams']] 
+1

太棒了!謝謝你這樣詳細的回答! – student

+0

需要35秒而不是6小時。這幾乎是可怕的:) – student

+0

@student:我很高興它爲你解決。 –