2017-10-07 24 views
0

所以我想知道是否有可能將列表的子列表放入字典中。將列表的子列表轉換成字典

例如,列表包含:

cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d, "b", "a", "d"]] 

將根據子列表

{a : ["a", "b", "a"], c : ["c", "b", "a", "c"], d: ["d, "b", "a", "d"] } 

通知的第一個字母,它僅存儲鑰匙的第一子列表被存儲到一個字典從「a」開始而不是下一個。

我的代碼如下:

def syn(graph,start): 
    empty = [] 

    cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d, "b", "a", "d"]] 

    lei = dict() 
    for items in cy: 
     if items[0] in lei: 
      lei[items[0]] += items 

     else: 
      lei[items[0]] = items 
     return lei 

但我得到的是

{a : ["a", "b", "a"]} 

有什麼辦法解決這一問題?

回答

0

雖然你可以非常巧妙迭代倒退,如@ juanpa.arrivillaga的和@RomanPerekhrest解決方案演示,另一種方法是簡單遍歷列表和用戶的any功能:

cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d", "b", "a", "d"]] 
new_list = [] 
for i in cy: 
    if not any(i[0] == b[0] for b in new_list): 
     new_list.append(i) 

final_dict = {i[0]:i for i in new_list} 

輸出:

{'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c'], 'd': ['d', 'b', 'a', 'd']} 
2

隨着簡單dict理解:

cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d", "b", "a", "d"]] 
result = {l[0]: l[:] for l in cy[::-1]} 

print(result) 

輸出:

{'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c'], 'd': ['d', 'b', 'a', 'd']} 

  • cy[::-1] - 處理相反的順序,以防止由相同「鍵重疊輸入列表「
+0

不錯!恕我直言,用'l [:]'複製的列表值得小記。 – VPfB

0

最直接的方法是遍歷列表向後,將基於第一個元素的列表中dict。既然你倒着走,這保證了第一子列表將包含在你的dict名單:

>>> result = {} 
>>> for sub in reversed(cy): 
...  result[sub[0]] = sub 
... 
>>> result 
{'d': ['d', 'b', 'a', 'd'], 'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c']} 
>>> 

所以,你將保持最後遇到的值,但名單中以相反的順序的最後一個值是前進順序中的第一個值!

0

使用熊貓:

import pandas as pd 

cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d", "b", "a", "d"]] 

# create a df 
df = pd.DataFrame([[i] for i in cy],[i[0] for i in cy]) 

# export it in reverse order 
df.iloc[::-1].T.to_dict(orient='rows')[0] 

回覆轉身:

{'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c'], 'd': ['d', 'b', 'a', 'd']}