【问题标题】:Python list dictionary comprehensionPython列表字典理解
【发布时间】:2011-03-18 12:28:44
【问题描述】:

我有一些包含几个字典的“列表”——比如 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

【问题讨论】:

  • 原始列表中的字典是否总是只包含一个键值对?这两个列表是否总是包含具有相同键的字典?
  • 您真的需要将结果列表分配给单独的变量吗?
  • @Wooble:是的,ori dicts 是一个键值对。是的,键也是一样的。 @Vlad:不明白,但订单需要在结果列表中维护。

标签: python list dictionary list-comprehension


【解决方案1】:

首先将您的列表转换为字典

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

【讨论】:

  • 如果d[0]中不是所有的键怎么办?
  • 像魅力一样工作。谢谢!试图通过将它们分成几部分来理解第 1 步。我猜,转置是这些步骤中的关键。
  • @siva:转置没有那么重要。我只是将其用作获取密钥的便捷方式。您还可以使用data = [[k] + [e[k] for e in d] for k in keys] 立即以正确的方向获取数据。 (你需要.writerows(data) 进一步向下。)
【解决方案2】:

您确定输入数据不能用 2-tuples 而不是 dicts 表示吗?

如果答案是否定的,那么到目前为止我看到的其他解决方案将不适用于所有可能的情况,例如输入项在字典中有多个条目。这个将:

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

【讨论】:

  • 也有效!..您指的是其他解决方案不起作用的哪些可能情况?例子?
  • 其中一个输入可能是[{'dc_test': 1, 'ac_test':2}, {'con_test':3}]
【解决方案3】:

这是创建列表的方法:

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

您也可以将所有列表放在一个列表中,并在写入文件时循环遍历它们。

【讨论】:

  • 有帮助.. 但是得到一个错误 :: mx, mn = makeLists(max_val, min_val ValueError: too many values to unpack. 我的 ori 列表中有数百个字典。
  • @siva:那么就使用myLists = list(makeLists(...))。另外,这是非常基本的东西,也许你应该先阅读tutorial
  • 是的,你是对的。我从头开始,开始喜欢 python。在这里和那里进行实验。仍处于学习曲线中。 :) 仅根据需要阅读教程,但有时会卡住。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2021-03-12
  • 1970-01-01
  • 2018-03-18
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多