2017-02-15 84 views
0

我有字典的名單,看起來像這樣:的Python如何字典的列表轉換爲一個元組列表

list=[{u'hello':['001', 3], u'word':['003', 1], u'boy':['002', 2]}, 
    {u'dad':['007', 3], u'mom':['005', 3], u'honey':['002', 2]} ] 

我需要的是要以創建的元組的列表我的名單上迭代像這樣:

new_list=[('hello','001', 3), ('word','003',1), ('boy','002', 2) 
      ('dad','007',3), ('mom', '005', 3), ('honey','002',2)] 

注意!具有零的數字('001',003'...等等)必須考慮爲一個字符串。

有沒有人可以幫助我?

+1

如果兩個字典中都存在密鑰,該怎麼辦? –

+1

SO不是代碼寫入服務。你應該至少表現出最小的努力來解決這個問題。 – DeepSpace

+0

如果一個密鑰出現兩次,它必須被編寫兩次。 – CosimoCD

回答

3

您可以使用列表理解爲:

new_list = [(key,)+tuple(val) for dic in list for key,val in dic.items()] 

在這裏,我們遍歷所有dic tonaries in list。對於每個dic指數,我們遍歷它的.items()並提取keyval ue,然後我們構建一個元組,用於(key,)+val

值是否與字符串無關:列表理解只是簡單地複製引用,所以如果原始元素是Foo s,它們仍然是Foo s。

最後請注意,詞典是無序的,所以順序是不確定的。但是,如果字典d1出現在字典d2之前,則第一個元素的所有元素都將放在列表中的元素之前。但是每個單獨字典的元組順序不確定。

+0

@Willwm Van Onsem,你的代碼很好用。非常感謝! – CosimoCD

2

列表的理解一個襯爲的Python 3.5+

my_list=[{u'hello':['001', 3], u'word':['003', 1], u'boy':['002', 2]}, 
     {u'dad':['007', 3], u'mom':['005', 3], u'honey':['002', 2]}] 

result = [(k, *v) for f in my_list for k,v in f.items()] 

# [('word', '003', 1), ('hello', '001', 3), ('boy', '002', 2), ('dad', '007', 3), ('honey', '002', 2), ('mom', '005', 3)] 

PS:因爲它是一個Python內置不要使用變量名list

對於舊版本的Python,請參閱@WillemVanOnsem的答案,它不使用加星號的表達式(*v)。

+1

那些'u'字符串表示OP使用的是Python 2,所以'(k,* v)'中的星號擴展不適用於它們。 –

+1

葉,這很好,如果你有Python 3.5+ –

+0

更新。感謝您指出。 –

0

如果在字典中的值總是長度爲2的列表,你可以這樣做:

new_list = [ (key, value[0], value[1]) for dict in list for key, value in dict.iteritems() ] 
+1

你必須交換'for'語句... –

+0

是的,你是對的! @WillemVanOnsem! –

+0

編輯,謝謝! –

0

假設你不關心具有輸出重新編碼爲ASCII作爲例子顯示,該你不關心維持秩序,並且要合併的情況下,他們顯得比整個上市字典的工會一旦更多的項目,該代碼示例應該工作:

>>> input_list = [ 
... {u'hello': ['001', 3], u'word': ['003', 1], u'boy': ['002', 2]}, 
... {u'dad': ['007', 3], u'mom': ['005', 3], u'honey': ['002', 2]}] 
... 
>>> temporary_dict = {} 
>>> output_list = [] 
>>> for dictionary in input_list: 
...  for key in dictionary.keys(): 
...   if key in temporary_dict: 
...    temporary_dict[key] += dictionary[key] 
...   else: 
...    temporary_dict[key] = dictionary[key] 
... 
>>> for key in temporary_dict.keys(): 
...  output_list.append(tuple([key] + temporary_dict[key])) 
... 
>>> print(output_list) 
[(u'dad', '007', 3), (u'boy', '002', 2), (u'word', '003', 1), 
(u'honey', '002', 2), (u'mom', '005', 3), (u'hello', '001', 3)] 

注意我第一次串連的鑰匙從所有列出的字典變成temporary_dict,然後遍歷該字典,製作字典key的連接列表以及該鍵的值(temporary_dict[key]),並將它們附加到新的輸出列表中。

請讓我知道,如果我的任何假設是不正確的。

2
list=[{u'hello':['001', 3], u'word':['003', 1], u'boy':['002', 2]}, 
    {u'dad':['007', 3], u'mom':['005', 3], u'honey':['002', 2]} ] 

>>> [map(lambda (k,v): (k,)+tuple(v), dictionary.iteritems()) for dictionary in list] 

[[(u'boy', '002', 2), (u'word', '003', 1), (u'hello', '001', 3)], [(u'dad', '007', 3), (u'honey', '002', 2), (
u'mom', '005', 3)]] 
>>> 
相關問題