我有一个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)]
请注意!带零的数字(' 001',003' ......等等)必须考虑为字符串。
有没有人可以帮助我?
答案 0 :(得分:5)
您可以使用列表理解:
new_list = [(key,)+tuple(val) for dic in list for key,val in dic.items()]
这里我们迭代所有dic
音调in list
。对于每个dic
我们迭代.items()
并提取key
和val
ue,然后我们使用(key,)+val
构建一个元组。
值是否为字符串无关紧要:列表推导仅复制引用,因此如果原始元素为Foo
s,则它们仍为Foo
。
最后请注意,词典是无序的,所以顺序是不确定的。但是,如果字典d1
出现在字典d2
之前,则第一个元素的所有元素将放在后者的元组之前的列表中。但是每个字典的元组顺序都没有确定。
答案 1 :(得分: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:不要使用变量名list
,因为它是内置的python。
对于旧版本的Python,请参阅@WillemVanOnsem的答案,该答案不使用已加星标的表达式(*v
)。
答案 2 :(得分: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)]]
>>>
答案 3 :(得分:1)
如果字典中的值始终是长度为2的列表,则可以执行以下操作:
new_list = [ (key, value[0], value[1]) for dict in list for key, value in dict.iteritems() ]
答案 4 :(得分:1)
假设您不关心将输出重新编码为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]
),并将它们附加到新的输出列表。
如果我的任何假设不正确,请告诉我。