Как добавить словарь в список в цикле - PullRequest
3 голосов
/ 21 января 2012

В моем распоряжении огромное количество данных в виде списка кортежей. Каждый кортеж имеет указанный формат, например (a, b, c, d, e). Список кортежей выглядит так:

tupleList = [('a1', 'b1', 'c1', 'd1', 'e1'),
             ('a2', 'b2', 'c2', 'd2', 'e2'),
             ...
             ('a10000', 'b10000', 'c10000', 'd10000', 'e100000')]

Я хочу преобразовать каждый из этих кортежей в словарь и добавить словарь в окончательный список словарей. Можно ли все это сделать в цикле? Окончательный список словарей должен выглядеть так:

finalDictList = [{'key1': 'a1', 'key2': 'b1', 'key3': 'c1', 'key4': 'd1', 'key5': 'e1'},
                 {'key1': 'a2', 'key2': 'b2', 'key3': 'c2', 'key4': 'd2', 'key5': 'e2'},
                 {'key1': 'a3', 'key2': 'b3', 'key3': 'c3', 'key4': 'd3', 'key5': 'e3'},
                 ...
                 {'key1': 'a10000', 'key2': 'b10000', 'key3': 'c10000', 'key4': 'd10000', 'key5': 'e10000'}]

Формат кортежей фиксированный. Я хочу сравнить послесловия, значение каждого ключа словаря со всеми остальными. Вот почему преобразование кортежа в словарь имело смысл для меня. Пожалуйста, поправьте меня, если сама парадигма дизайна кажется неправильной. Кроме того, есть> 10000 кортежей. Объявить, что много словарей просто не сделано.

Есть ли способ добавить словарь в список в цикле? Также, если это возможно, можем ли мы получить доступ к каждому словарю по его значениям ключа, скажем, как finalDictList[0]['key1']?

Ответы [ 7 ]

10 голосов
/ 21 января 2012

Мы собираемся смешать три важных понятия, чтобы сделать этот код действительно маленьким и красивым. Сначала понимание списка , затем метод zip и, наконец, метод dict , для построения словаря из списка кортежей:

my_list = [('a1', 'b1', 'c1', 'd1', 'e1'), ('a2', 'b2', 'c2', 'd2', 'e2')]
keys = ('key1', 'key2', 'key3', 'key4', 'key5')
final = [dict(zip(keys, elems)) for elems in my_list]

После этого значение переменной final равно:

>>> final
[{'key3': 'c1', 'key2': 'b1', 'key1': 'a1', 'key5': 'e1', 'key4': 'd1'},
{'key3': 'c2', 'key2': 'b2', 'key1': 'a2', 'key5': 'e2', 'key4': 'd2'}]

Кроме того, вы можете получить элементы определенного словаря, используя положение словаря в списке и ключ, который вы ищете, т.е.

>>> final[0]['key1']
'a1'
6 голосов
/ 21 января 2012

Используйте zip, чтобы объединить предопределенный список имен ключей с каждым кортежем в вашем входном списке, а затем передать результаты в dict, чтобы превратить их в диктанты. Оберните все это в понимание списка, чтобы обработать их все в одной партии:

keys = ('key1', 'key2', 'key3', 'key4', 'key5')
finalDictList = [dict(zip(keys, values)) for values in tupleList]
4 голосов
/ 21 января 2012

Я не уверен, что понимаю, почему вам нужно преобразовать все в словарь, если у вас уже есть список кортежей.

>>> tupleList = [('a1', 'b1', 'c1', 'd1', 'e1'),
...              ('a2', 'b2', 'c2', 'd2', 'e2'),
...              ('a10000', 'b10000', 'c10000', 'd10000', 'e100000')]
>>> [x[1] for x in tupleList]
['b1', 'b2', 'b10000']

Использование Python понимание списка синтаксис, вы можете получить список всех n-х элементов каждого кортежа.

3 голосов
/ 21 января 2012

Если поля являются фиксированными, вы можете сделать это:

fields = ['key1', 'key2', 'key3', 'key4', 'key5']

newList = [dict(zip(fields, vals)) for vals in oldList]
2 голосов
/ 21 января 2012

Если, как вы говорите, у вас много записей, помните, что в python есть namedtuples :

>>> tupleList = [('a1', 'b1', 'c1', 'd1', 'e1'),
...              ('a2', 'b2', 'c2', 'd2', 'e2'),
...              ('a10000', 'b10000', 'c10000', 'd10000', 'e100000')]
>>>
>>> from collections import namedtuple
>>> fv = namedtuple('fivevals', ('key1', 'key2', 'key3', 'key4', 'key5'))
>>> tuplelist = [fv(*item) for item in tupleList]
>>> 
>>> tuplelist[0].key1
'a1'
>>>

Именованные кортежи могут быть приняты по ключу, но в то же время они легки и требуют не больше памяти, чем обычные кортежи.

0 голосов
/ 21 января 2012
from itertools import izip

keys = ['key1', 'key2', 'key3', 'key4', 'key5']
finalDictList = [dict(izip(names, x)) for x in tupleList]
0 голосов
/ 21 января 2012
finalDictList = []
for t in tupleList:
    finalDictList.append({
        'key1': t[0],
        'key2': t[1],
        'key3': t[2],
        'key4': t[3],
        'key5': t[4],
    })

Кроме того, если это возможно, можем ли мы получить доступ к каждому словарю по его ключевым значениям, например, как finalDictList [0] ['key1']?

именно так вы и сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...