Понимание словаря списка Python - PullRequest
1 голос
/ 18 марта 2011

У меня есть несколько «списков», содержащих несколько словарей, скажем, 3 слова. 3 словаря в следующем:

lstone = [{'dc_test': 1}, {'ac_test':2}, {'con_test':3}]
lsttwo = [{'dc_test': 4}, {'ac_test':5}, {'con_test':6}]

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

newlistone = ['dc_test',1,4]
newlisttwo = ['ac_test',2,5]
newlistthree = ['con_test',3,6]

Моя цель - написать новый CSV-файл, чтобы он выглядел следующим образом:

dc_test,1,4
ac_test,2,5
con_test,3,5

Ответы [ 3 ]

7 голосов
/ 18 марта 2011

Сначала преобразуйте свой список в словари

d = [dict(itertools.chain(*(d.iteritems() for d in a)))
     for a in [lstone, lsttwo]]

Далее создайте транспонированный список:

keys = d[0].keys()
transposed = [[e[k] for k in keys] for e in d]

Наконец, транспонируйте и используйте csv.writer, чтобы записать это в файл:

with open("a.csv", "wb") as f:
    csv.writer(f).writerows(zip(keys, *transposed))
2 голосов
/ 18 марта 2011

Вы уверены, что входные данные не могут быть представлены 2-кортежами вместо dicts?

Если ответ отрицательный, то другие решения, которые я видел до сих пор, не будут работать для всех возможныхслучаи, как элемент ввода, имеющий более одной записи в dict.Этот будет:

from collections import defaultdict
lstone = [{'dc_test': 1}, {'ac_test':2}, {'con_test':3}]
lsttwo = [{'dc_test': 4}, {'ac_test':5}, {'con_test':6}]

# merge
merge = defaultdict(list)
for e in lstone + lsttwo:
    for k, v in e.items():
        merge[k].append(v)
# flatten
result = [ [k] + v for k, v in merge.items()] 
print result
# your option as to how to convert to CSV
1 голос
/ 18 марта 2011

Вот как вы можете создавать списки:

def makeLists(*lists):
    for dicts in zip(*lists):
        key = dicts[0].iterkeys().next()
        yield [key] + [d[key] for d in dicts]

newlistone, newlisttwo, newlistthree = makeLists(lstone, lsttwo)

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

Чтобы записать все это в файл, используйте это:

with open("test.txt", "w") as file:
    file.write(",".join(newlistone) + "\n")
    # other lines individually

Вы также можете поместить все списки в один список и зациклить их при записи в файл.

...