2017-02-15 5 views
0

У меня есть список Словаре, который выглядит следующим образом:Python, как преобразовать список 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 '... и т. д.) должны рассматриваться как строка.

Есть ли кто-нибудь, кто может мне помочь?

+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. Для каждого dic7 мы перебираем его .items() и извлекаем key и val 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: Не используйте имя переменной list, так как это питон встроенный.

Для более старых версий Python см. Ответ @WillemVanOnsem, который не использует выделенные выражения (*v).

+1

Эти 'u'-строки указывают, что OP использует Python 2, поэтому расширение звезды в' (k, * v) 'не будет работать для них. –

+1

Yeh, это хорошо, если у вас есть 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)]] 
>>>