Python 列表字典推导式
我有几个“列表”,里面包含了几个字典,比如说有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))