【问题标题】:Populate different dictionaries with Python dictionary comprehension使用 Python 字典理解填充不同的字典
【发布时间】:2020-10-17 17:27:02
【问题描述】:

我想压缩这个语法以避免双重字典理解(我希望获得一些计算时间)

d1 = {loc:list(np.sum(data, 0)) for loc, data in dicos.items()}
d2 = {loc:np.nancumsum(list(np.sum(data, 0))) for loc, data in dicos.items()}

我试过这个没有成功

d1,d2 = [{loc:list(np.sum(data, 0)),loc:np.nancumsum(list(np.sum(data, 0)))} \
         for loc, data in dicos.items()]

【问题讨论】:

  • “没有成功”是什么意思?你得到不正确的结果吗?如果您遇到错误,请edit您的问题并将错误的全文复制到其中。
  • 如果你想要 2 个不同的字典,我不明白,你必须创建 2 次。即使您能够单线完成,时间当然与两线方法相同
  • 没有两个表达式就不能构造两个字典。您也许可以将两者都包含在一些理解中,但我怀疑这会对您有很大帮助。需要构造lists吗?如果没有 list(...) 调用,我怀疑您仍然可以获得一些性能。
  • @venky__ 我认为他们希望避免重复 dicos.items() 两次。
  • 这些操作需要多长时间?这只是一个学术练习,还是你有足够的数据来处理它值得额外的努力?如果您真的需要节省时间,也许您应该使用multiprocessing 模块并在单独的内核上并行运行每个模块。

标签: python dictionary-comprehension


【解决方案1】:

我不理解我们社区最近对试图将越来越多的功能推入单一理解的痴迷。结果不仅通常不比使用可见循环更有效,而且当作为单一的复杂理解完成时,代码的可读性肯定要低得多。我认为人们不明白的是,无论哪种方式,循环仍然以几乎相同的形式存在……只是如果你使用理解,它在 Python 库代码中对你隐藏。

这是一种简洁易读的方式来做你想做的事,你只需对数据进行一次传递,构建两个字典,并且非常清楚你在做什么:

d1 = {}
d2 = {}
for loc, data in dicos.items():
    d1[loc] = list(np.sum(data, 0))
    d2[loc] = np.nancumsum(list(np.sum(data, 0)))

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多