Python 列表字典推导式

1 投票
3 回答
1838 浏览
提问于 2025-04-16 13:57

我有几个“列表”,里面包含了几个字典,比如说有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 个回答

1

这是你可以创建列表的方法:

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

你也可以把所有列表放在一个大列表里,然后在写入文件时逐个处理它们。

2

你确定输入的数据不能用二元组(2-tuples)来表示,而不是用字典(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
7

首先,把你的列表转换成字典

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))

撰写回答