【问题标题】:How to make this dictionary comprehension more readable [closed]如何使这个字典理解更具可读性[关闭]
【发布时间】:2013-10-29 20:53:48
【问题描述】:

我想知道如何重写它以使其更具可读性,以便我和其他人将来可以理解它而不会产生任何混淆:

d1 = {'a':True, 'b':False, 'c':True}
d2 = {'a':False, 'b':True, 'c':True}
# wanted output: False if either value is False, True only if both are True
# d3 = {'a':False, 'b':False, 'c':True}

d3 = {key: (d1[key] and d2[key]) for key in d1}

我不是在寻找最冗长的版本,而是在寻找清晰易读的版本。

【问题讨论】:

  • 你有什么不明白的地方?
  • 在我看来还不错!
  • 可能是最好的方法:D
  • 您可以通过使用更有意义的变量名使其更具可读性

标签: python dictionary list-comprehension human-readable


【解决方案1】:

在我看来,您所拥有的内容非常易于阅读。您可能可以重命名这三个字典以更准确地描述它们的用途,但仅此而已。我认为您要使其更清晰的唯一方法是将其扩展为显式循环。

# This would be so much nicer with real variable names, don't you agree?
d1_AND_d2 = {}
for key in d1:
    d1_AND_d2[key] = d1[key] and d2.get(key) # Use get in case d1 has more keys.

【讨论】:

  • 我们打电话给d3d1ANDd2...
  • @Floris 我喜欢它:-D
【解决方案2】:

我是用 itertools 写的,结果可读性差很多:

from itertools import groupby
from operator import itemgetter

d1 = {'a':True, 'b':False, 'c':True}
d2 = {'a':False, 'b':True, 'c':True}

key = itemgetter(0)
value = itemgetter(1)

d3 = {key: all(map(value, values))
      for key, values in groupby(sorted(d1.items() + d2.items()), key)}

我发现你的版本更具可读性。

(我知道这并不完全符合您的要求,但这是我在尝试给出真实答案时想出的,需要与他人分享。)

【讨论】:

  • 我不能真正支持它,但我会给你一个微笑的努力:\^-^/
  • @Floris 我鞠躬,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多