если еще список понимания в словаре - PullRequest
0 голосов
/ 06 апреля 2020

Допустим, у меня есть словарь,

pets ={'Dogs' : np.array(['Oscar','Coco']), 'Cats' : np.array(['Sylvester']), 'Parrots' : np.array([])}

Далее я хочу сформировать новый словарь, в котором я хочу заменить пустой массив значением None, но оставшиеся значения оставим без изменений

petsNew = {k : None if v.size == 0 else k : v  for k,v in pets.items()}

Однако, это приводит к синтаксической ошибке, есть идеи почему?

Требуется вывод:

petsNew
{'Dogs' : np.array(['Oscar','Coco']), 
'Cats' : np.array(['Sylvester']), 
'Parrots' : None}

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вам необходимо понять, что синтаксис третичного условия равен x if y else z, k : является частью словарного понимания, не третичное условие. Поэтому, когда k: является частью условия else, это приводит к недопустимому синтаксису.

Поэтому исправление удаляет лишние k : в пределах вашего третичного состояния:

petsNew = {k: None if v.size == 0 else v for k, v in pets.items()}
1 голос
/ 06 апреля 2020

Словарь имеет только отдельные выражения для ключа и значения. k : v само по себе не является допустимым выражением, поэтому оно также не может быть вложено в выражение if-then-else. Вам нужно будет обернуть ключ и значение каждого в отдельное выражение if-then-else, чтобы оно работало.

К счастью, поскольку ключ одинаков в обоих случаях, вам просто нужно создать выражение для значение.

{k : (None if v.size == 0 else v) for k,v in pets.items()}
...