Python условное словарное понимание - PullRequest
1 голос
/ 21 февраля 2012

Есть ли причина, по которой этот список работает?

N = 5
d = {0:100, 2:5}
[(dpidx,d[dpidx]) if dpidx in d else (dpidx,dpidx) for dpidx in range(N)]

[(0, 100), (1, 1), (2, 5), (3, 3), (4, 4)]

но этот dict comp не работает? :

{dpidx:d[dpidx] if dpidx in d else dpidx:dpidx for dpidx in range(N)}

{dpidx:d[dpidx] if dpidx in d else dpidx:dpidx for dpidx in range(N)}
                                        ^
SyntaxError: invalid syntax

Я ищу:

{0: 100, 1: 1, 2: 5, 3: 3, 4: 4}

Я думал, что мог бы просто использовать dict comp вместо dict (list comp).

Заранее спасибо!

Ответы [ 2 ]

10 голосов
/ 21 февраля 2012

Вы не можете повторить ключ. Понимание словаря имеет вид

{k: v for ...}

, где k и v - выражения. Одно (или оба) из этих выражений может быть условным выражением, которое даст

{dpidx:d[dpidx] if dpidx in d else dpidx for dpidx in range(N)}

Но k: v не является выражением само по себе.

Проще написать это

{dpidx:d.get(dpidx, dpidx) for dpidx in range(N)}
0 голосов
/ 21 февраля 2012

Вам нужно изменить dpidx: dpidx на dpidx

Помните, что "d [dpidx], если dpidx в d, иначе dpidx" означает значение в словаре, если оно есть, иначе значение dpidx ", не имеет смысла иметь" в противном случае значение dpidx: dpidx "

d={1:2,3:5}
N=5

g={dpidx: d[dpidx] if dpidx in d else dpidx for dpidx in range(N)}

print g
>>>
{0: 0, 1: 2, 2: 2, 3: 5, 4: 4}
...