2016-06-08 23 views
3

這是此問題的延伸:How to split a string within a list to create key-value pairs in Python如何使用僅列表鍵和鍵值對(Python)從列表中創建字典?

與上述問題的區別是我的列表中的項不是所有鍵值對;有些項目需要分配一個值。

我有一個列表:

list = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty'] 

我想創建一個字典:

dict = { 'abc':'ddd', 'ef':1, 'ghj':1, 'jkl':'yui', 'rty':1 } 

我想沿着線的東西:

a = {} 
for item in list: 
    if '=' in item: 
    d = item.split('=') 
    a.append(d) #I don't I can do this. 
    else: 
    a[item] = 1 #feel like I'm missing something here. 
+3

請包括你試過的代碼,並與它的問題。 –

+0

你需要一些解析器邏輯,它檢測包含'='的列表元素並將它們分成鍵和值。 – nucleon

回答

10

對於每個拆分「對」,您可以附加[1]並提取前2個元素。這樣一來,當沒有一個值1將用於:

print dict((s.split('=')+[1])[:2] for s in l) 
+3

這是一個驚人的。輝煌! –

+0

謝謝@fabricator!可以解釋爲什麼它不起作用,如果你沒有特別提取前兩個元素'[:2]'?想確保我理解一切。 –

+1

@AmeliaNChu,只是因爲'dict'方法需要它。從[documentation](https://docs.python.org/2/library/stdtypes.html#dict):'否則,位置參數必須是可迭代的對象。迭代器中的每個項目本身必須是一個具有兩個對象的迭代器' – Fabricator

1
input_list = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty'] 
output_dict = {} 

for item in input_list: 
    item_split = item.split('=') 
    key = item_split[0] 
    value = item_split[1] if len(item_split)>1 else 1 
    output_dict[key] = value 

更簡潔一點

for item in input_list: 
    i_s = item.split('=') 
    output_dict[i_s[0]] = i_s[1] if len(i_s)>1 else 1 

這樣做的好處是它不會爲通過拆分input_list的元素而創建的每個列表附加額外的元素。雖然,列表解析速度可能快於for循環

+1

它可以更容易地完成,但在發佈之前,我會先等待代碼嘗試和出現錯誤。 –

3

我將使用類似於你鏈接的帖子的東西。

d = dict(s.split('=') for s in a) 

如果你結合你可以從這個崗位學習 - 那就是用列表來創建詞典 - 並使用if/else in Python's list comprehension,你能想出這樣的事情:

d = dict(s.split("=", maxsplit=1) if "=" in s else [s, 1] for s in l) 

如果沒有等號,那麼它會將1添加到分割列表的末尾。

+0

'[s] + [1]'可以縮短爲'[s,1]' –

+0

這是我的書中真正的眩暈者 - 一行*和*完全可讀。 – nigel222

+0

注意,如果's'中有兩個或更多「=」,將會崩潰(引發ValueError)。這可能是最好的做法。 – nigel222

1

以下是一步一步的方法。

In [50]: mylist = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty'] 

In [51]: [element.split('=') for element in mylist] 
Out[51]: [['abc', 'ddd'], ['ef'], ['ghj'], ['jkl', 'yui'], ['rty']] 

In [52]: [element.split('=') + [1] for element in mylist] 
Out[52]: [['abc', 'ddd', 1], ['ef', 1], ['ghj', 1], ['jkl', 'yui', 1], ['rty', 1]] 

In [53]: [(element.split('=') + [1])[:2] for element in mylist] 
Out[53]: [['abc', 'ddd'], ['ef', 1], ['ghj', 1], ['jkl', 'yui'], ['rty', 1]] 

In [54]: dict((element.split('=') + [1])[:2] for element in mylist) 
Out[54]: {'abc': 'ddd', 'ef': 1, 'ghj': 1, 'jkl': 'yui', 'rty': 1} 
  • 爲了您的列表轉換在50行至一個字典,你需要將其轉換爲列表中的第53行
  • 51.第一步是每個元素分割線這個列表由等號表示。現在每個元素都被轉換爲一個1或2個元素的列表。注意一些像'ef'這樣的元素不具有等號,我們將不得不修復
  • 第52行。接下來,我們在每個子列表中追加1。這應該照顧有1個元素的子列表,但是使一些子列表長3個元素
  • 第53行:我們通過只取前兩個元素並將第三個元素放棄(如果適用),將所有子列表標準化爲2元素子列表。此列表現在以正確的格式轉換成字典
  • 第54行。最後一步是將此列表轉換爲字典。由於dict類可以採用生成器表達式,因此我們可以安全地刪除方括號。

就這樣,這裏是片段:

mylist = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty'] 
mydict = dict((element.split('=') + [1])[:2] for element in mylist) 
相關問題