2013-10-29 41 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

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