2013-01-24 85 views
1

這應該是微不足道的。然而,我不覺得我的技巧是100%確定的。在Python中反向索引列表列表

我有一個列表(lol;)),捕獲圖形節點之間的邊緣關係。假設我有一個指導的圖,其中4個節點標記爲0,1,2,3。邊是{(0,2),(0,3),(1,0),(1,3),( 2,1)}等鄰接LOL(稱之爲a)是

a = [[2,3],[0,3],[1],[]] 

我想找到發病笑了,即列出了指示哪些節點是入射在節點的列表。在這個例子中,發病率洛爾(稱之爲b)將是:

[[1], [2], [0], [0, 1]] 

我嘗試下面的代碼:

b = [[],[],[],[]] 
[b[j].append(i) for i,x in enumerate(a) for j in x] 

這給了我正確的關聯矩陣b

第二步,儘管工作,理想情況下應該是b[j].append(i) for i,x in enumerate(a) for j in x,沒有開放[和關閉]。但是Python解釋器在沒有它的情況下會發出語法錯誤。有沒有更好的措辭措辭呢?

回答

2

你的問題基本上是關於使用列表解析副作用。如,例如the answers to this question說,將它分解爲一個循環(或循環)正要走的路:

for i, x in enumerate(a): 
    for j in x: 
     b[j].append(i) 

而且,請注意,列表解析用於構建列出一個很自然的,簡單的方法,像數學家是用來做的。這就是爲什麼在Python中,語法需要方括號(在你的情況下)。

+0

我基本上想避免循環。如果我錯了,請糾正我,但我相信列表理解和其他內置函數可以比使用循環更有效。 – Nik

+0

事實上,Python經常會伴隨一些與列表理解相關的內部優化,但您也必須考慮代碼的可讀性。另一方面,Python的關鍵特性不包括性能,所以這一切都取決於代碼的用途。 – kaspersky