-1

この質問のバリエーションが既に存在することは知っていますが、私が達成しようとしているものと正確に一致するものを見つけることができません。私は次のコードを持っています。これには、同様の質問の解決策から取った解決策が含まれています。

b = {"1":0,"2":0,"3":0,"4":0,"5":0}
c = {"1":1,"4":4,"5":5}

d = [k for k in b if c.get(k, object()) > b[k]]

print d

私が望むのは、ディクショナリのすべてのキーと値のペアを のキーと値のペアと比較することbですc。キーと値のペアが欠落しているc場合、 のキー/ペアの値がbディクショナリdに保持されます。それ以外の場合、 の値はcに保持されdます。

上記の例では、次のようにdなります。

d = {"1":1,"2":0,"3":0,"4":4,"5":5}

行に必要な正しい構文を誰か教えてもらえますd =か?

ありがとう

4

3 に答える 3

2

実際の質問に答えるには

私が望むのは、辞書 b のすべてのキーと値のペアを c のキーと値のペアと比較することです。キーと値のペアが c にない場合、b のキー/ペアの値はディクショナリ d に保持されます。そうでない場合、c の値は d に保持されます。

>>> b = {"1":0,"2":0,"3":0,"4":0,"5":0}
>>> c = {"1":1,"4":4,"5":5}
>>> d = {k: c.get(k, b[k]) for k in b}
>>> d
{'1': 1, '3': 0, '2': 0, '5': 5, '4': 4}

Python 3 では、 を使用する必要があります( のキーだけでなく、collections.ChainMap から任意のキーを取得するという点で、これは少し異なることに注意してください) 。cb

>>> from collections import ChainMap
>>> b = {"1":0,"2":0,"3":0,"4":0,"5":0}
>>> c = {"1":1,"4":4,"5":5}
>>> d = ChainMap(c, b)
>>> d
ChainMap({'1': 1, '5': 5, '4': 4}, {'1': 0, '3': 0, '2': 0, '5': 0, '4': 0})
>>> d['1'], d['2'], d['4']
(1, 0, 4)
于 2015-01-11T23:16:18.530 に答える
0

またはおそらくこれ:

b = {"1":0,"2":0,"3":0,"4":0,"5":0}
c = {"1":1,"4":4,"5":5}

d = {k:b[k] if not c.get(k)>b[k] else c[k] for k in b}

d
{'1': 1, '2': 0, '3': 0, '4': 4, '5': 5}

bまたは、両方のキー/値をアンパックして比較したい場合:

{k:v if not c.get(k)>v else c[k] for k, v in b.iteritems()}

k:vの部分は として扱われkey=k、 にが存在せず、値がである場合value= vのみ、それ以外の場合は となります。kcc[k]> vv

また、c に存在しない場合はNonec.get(k)を返し、自動的にFalseに変換されます。kNone > v

于 2015-01-11T21:23:26.733 に答える
0

if-else理解の中で条件を使用する必要がありget、すべてが明確な場合は使用する必要もありません。

>>> d={k:c[k] if k in c and c[k]>b[k] else v for k,v in b.items()}
>>> d
{'1': 1, '3': 0, '2': 0, '5': 5, '4': 4}
于 2015-01-11T21:17:41.807 に答える