2013-10-29 34 views
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} 

我不是在寻找最可能的冗长版本,而只是明确的和人类可读的。

+5

什么是不可读你有什么? –

+0

看起来很好,因为它是我的! – hankd

+0

可能是最好的方法:D –

回答

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. 
+2

我们称之为'd3''d1ANDd2' ... – Floris

+0

@弗洛伊斯我喜欢它: -D –

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

我找到你的版本一大堆更具可读性。

(我知道这不是正是你要的,但是这就是我想出了,而试图给出一个真正的答案,并与他人分享必要的。)

+0

我真的不满意,但我会给你一个笑脸努力:\^- ^/ – Floris

+1

@弗洛伊斯,我鞠躬谢谢你。 –