2016-11-19 67 views
0

.I've一直在處理列表解析最近,我碰到一個問題就來了,我似乎無法來解決>Python的建設的值設置字典

讓我們說我有成對的形式: A, B,C,X = 「ABCX」 INIT = {(A,B),(B,C),(C,X)}

我試圖構建字典,其中每個鍵將是一個單獨的信中,每個值的所有連接這封信與其他,所以>

{A:{B},B:{A,C},C:{B,X},X:{C}} 

事情我試過>

final_dict = {k : {j for p,j in init if p==k} for k,v in init} 

但這返回我ONY如果合作伙伴位於第二位,

試圖增加首位>

final_dict = {k : {j for p,j in init if p==k or p if j == k} for k,v in init} 

會發生錯誤。

+0

是否可以使用同一個字母的倍數?這也不是一個嵌套字典,它是一個字符串作爲關鍵字並設置爲值的字典。 –

+0

不,沒有倍數,我會更正說明,謝謝 –

+0

解決方案是否必須是字典理解? –

回答

0

這裏是沒有字典補償

init = {('A','B'),('B','C'),('C','X')} 

d = {} 
for k, v in init: 
    d.setdefault(k, set()).add(v) 
    d.setdefault(v, set()).add(k) 

解決的問題是,與數據當前的格式不能正確指定鍵,值。理想情況下,應該是。

init = {('A','B'),('B','A'),('B','C'),('C','B'),('C','X'),('X','C')} 

,您可以通過以下操作獲得,如果你不想/不能調整當前的方法用於獲取對。

init2 = {(y, x) for x, y in init}.union(init) 

所以,你可以再做

d = { key : { v for k, v in init2 if k == key } for key, _ in init2 } 

也有這一點,但它不包括X,並再次它可能會變得更大,使工作由於當前格式。

d = { k : {v1 if k == v2 else v for v1, v2 in init } for k, v in init }