2016-03-09 2 views
4

У меня есть следующий набор данных, который я прочитал в из текстового файла:Создание списка словарей в Python

all_examples= ['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5'] 

Мне нужно создать список словаря следующим образом:

lst = [ 
{"A":1, "B":2, "C":4, "D":4 }, 
{"A":1, "B":1, "C":4, "D":5 } 
] 

Я попытался использовать функцию генератора, но было сложно создать список как таковой.

attributes = 'A,B,C' 
def get_examples(): 

    for value in examples: 
     yield dict(zip(attributes, value.strip().replace(" ", "").split(','))) 
+0

Неверный желаемый выходной словарь. Пожалуйста, отредактируйте свой пост. –

+2

Почему бы не указать один ключевой пункт в список, содержащий отображаемые значения? –

+2

У вас может быть список, содержащий словари. Но у вас не может быть словаря, который просто содержит списки. Вам нужны ключи: пары значений в словаре. Также ваш ввод - это строго список строк. Поэтому посмотрите, используя 'split', чтобы сначала включить это в список списков. – roadrunner66

ответ

6

Один лайнер, просто для удовольствия:

all_examples = ['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5'] 

map(dict, zip(*[[(s[0], int(x)) for x in s.split(',')[1:]] for s in all_examples])) 

Производит:

[{'A': 1, 'C': 4, 'B': 2, 'D': 4}, 
{'A': 1, 'C': 4, 'B': 1, 'D': 5}] 

В качестве бонуса, это будет работать для более длинных последовательностей тоже:

all_examples = ['A,1,1,1', 'B,2,1,2', 'C,4,4,3', 'D,4,5,6'] 

Выход:

[{'A': 1, 'C': 4, 'B': 2, 'D': 4}, 
{'A': 1, 'C': 4, 'B': 1, 'D': 5}, 
{'A': 1, 'C': 3, 'B': 2, 'D': 6}] 

Объяснение:

map(dict, zip(*[[(s[0], int(x)) for x in s.split(',')[1:]] for s in all_examples])) 
  • [... for s in all_examples] Для каждого элемента в списке:
  • s.split(',')[1:] Split его запятыми, а затем принять каждый элемент после первого
  • (...) for x in и превратить его в список кортежей
  • s[0], int(x) первой буквы, с этим элементом c инвертировано в целое число
  • zip(*[...]) теперь транспонируйте свои списки кортежей
  • map(dict, ...) и превратите каждый в словарь!
+0

отличное решение, но есть ли способ создать упорядоченный словарь? Результат здесь неупорядочен. –

+2

Регулярные словари в python всегда неупорядочены; если вы хотите упорядоченный, просто добавьте 'из коллекции import OrderedDict' и используйте это вместо' dict'. – tzaman

1

Вы на самом деле есть список строк, и вы хотели бы иметь список спаренных словарей, полученных от того же ключа в кортеже троек каждой строки.

Чтобы сделать это относительно простым, я использую цикл for вместо сложной структуры понимания словаря.

my_dictionary_list = list() 
d1 = dict() 
d2 = dict() 
for triplet_str in all_examples: 
    key, val1, val2 = triplet_str.split(',') 
    d1[key] = val1 
    d2[key] = val2 
my_dictionary_list.append(d1) 
my_dictionary_list.append(d2) 

>>> my_dictionary_list 
my_dictionary_list 
[{'A': '1', 'B': '2', 'C': '4', 'D': '4'}, 
{'A': '1', 'B': '1', 'C': '4', 'D': '5'}] 
1

Ваш вопрос должен быть «Как составить список словарей?». Вот что вы хотели бы рассмотреть.

>>> dict={} 
>>> dict2={} 
>>> new_list = [] 
>>> all_examples=['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5'] 
>>> for k in all_examples: 
...  ele=k.split(",") 
...  dict[str(ele[0])]=ele[1] 
...  dict[str(ele[0])]=ele[2] 
...  new_list.append(dict) 
...  new_list.append(dict2) 
>>> dict 
{'A': '1', 'C': '4', 'B': '2', 'D': '4'} 
>>> dict2 
{'A': '1', 'C': '4', 'B': '1', 'D': '5'} 
3

Кроме того, только для развлечения, но с акцентом на понятности:

all_examples = ['A,1,1', 'B,2,1', 'C,4,4', 'D,4,5'] 
ll = [ x.split(",") for x in all_examples ] 
ld = list() 
for col in range(1, len(ll[0])): 
    ld.append({ l[0] : int(l[col]) for l in ll }) 
print ld 

напечатает

[{'A': 1, 'C': 4, 'B': 2, 'D': 4}, {'A': 1, 'C': 4, 'B': 1, 'D': 5}] 

работает до тех пор, как вход в формате CSV с целыми числами и линии одинаковой длины.

Диссекция: Я буду использовать тему «предмет» для A, B и C и «измерение» для «столбцов» в данных, т.е.те значения в том же «csv-столбце» данных inut.

Получить входные строки данных в список для каждой строки: A,1,1 ->["A","1","1"]

ll = [ x.split(",") for x in all_examples ] 

Результат должен быть список dicts, так что давайте инициализировать один:

ld = list() 

Для каждого измерения (при условии, что все линии имеют одинаковое количество столбцов):

for col in range(1, len(ll[0])): 

Возьмите вещь l[0], например. «A», из строки и присвоить числовое значение int(), например. 1, измерения в соответствующем столбце l[col], т.е. «1», к чему-то. Затем используйте dictionary comprehension, чтобы объединить его в следующую строку желаемого результата. Наконец append()dict в список результатов ld.

ld.append({ l[0] : int(l[col]) for l in ll }) 

View unfoamted. Используйте print json.dumps(ld, indent=4) для более удобного отображения:

print ld 

Надеется, что это помогает. Узнайте больше о пониманиях dict, например. here (версия этой великолепной книги Python3).

+0

вы можете немного объяснить это? –

+1

добавил немного диссекции к ответу ... – flaschbier

Смежные вопросы