3

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

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}

我不是在寻找最可能的冗长版本,而是在寻找清晰且易于阅读的版本。

4

2 回答 2

2

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

# 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.
于 2013-10-29T20:57:54.880 回答
0

我用 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)}

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

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

于 2013-10-29T21:24:42.273 回答