Python如何将dict列表转换为元组列表

Python如何将dict列表转换为元组列表,python,list,dictionary,tuples,Python,List,Dictionary,Tuples,我有一个dict列表,如下所示: 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), ('

我有一个dict列表,如下所示:

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)]
我需要的是在我的列表上迭代,以便创建如下元组列表:

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',等等)必须视为字符串


有人能帮我吗?

列出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)]
注意:不要使用变量名
list
,因为它是python内置的


对于较旧版本的Python,请参见@WillemVanOnsem提供的答案,该答案不使用星号表达式(
*v
)。

您可以使用列表理解:

new_list = [(key,)+tuple(val) for dic in list for key,val in dic.items()]
在这里,我们迭代列表中的所有
dic
音调
。对于每个
dic
tionary,我们迭代其
.items()
并提取
val
ue,然后用
(键,)+val
为其构造一个元组

值是否为字符串无关紧要:列表理解只是复制引用,因此如果原始元素是
Foo
s,它们将保持
Foo
s


最后请注意,字典是无序的,因此顺序是不确定的。但是,如果字典
d1
出现在字典
d2
之前,则第一个的所有元素都将放在后面元组之前的列表中。但是每个字典的元组顺序没有确定。

如果字典中的值总是长度为2的列表,则可以执行以下操作:

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

假设您不关心将输出重新编码为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)]
请注意,我首先将所有列出的字典中的键连接到一个
临时dict
,然后迭代该字典,生成字典
以及该键值的连接列表(
临时dict[key]
),并将它们附加到一个新的输出列表中


如果我的任何假设不正确,请告诉我。

如果两个字典中都出现了一个键,该怎么办?因此,这不是代码编写服务。您自己至少应该尽最小的努力来解决这个问题。如果一个键出现两次,它必须被写入两次。@WillemVanOnsem这似乎不是问题。@cosmocurie您使用的是哪种Python版本?那些
u
-字符串表示OP使用的是Python 2,因此
(k,*v)中的星形扩展
对他们不起作用。是的,如果你有Python 3.5,这很好+
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)]]
>>>