2016-09-05 2 views
-1

С двух словарей:Использование еще в Словаре понимании

d1 = {a:a for a in 'abcdefg'} 
d2 = {n:n for n in range(10)} 

Как я могу создать третий, как:

new_dict = {k:d1[k] if k in d1.keys() else k:d2[k] for k in 'abc123' } 

Это бросает синтаксическую ошибку, но со списком понимания, кажется, хорошо:

[a if a else 2 for a in [0,1,0,3]] 
out[]: [2, 1, 2, 3] 

Кроме того, почему это работает:

{k:d1[k] for k in 'abc123' if k in d1.keys() } 

и это не делает:

{k:d1[k] if k in d1.keys() for k in 'abc123' } 
+1

Что такое ожидаемый вывод для 'new_dict'? Довольно непонятно, о чем вы просите. Вы используете тернарный оператор для пар 'k: v', который является незаконным, но вы легко можете использовать его для' k' и для 'v' в отдельности. –

+0

@ ŁukaszRogalski Я хочу создать новый dict с помощью клавиш abc123 ', значения для этих ключей находятся в двух других dicts, которые у меня уже есть. –

ответ

1

Вы не можете использовать ключ-значения пара в else части тройной условную как так.

ли это вместо:

new_dict = {k: d1[k] if k in d1 else d2[int(k)] for k in 'abc123'} 
#         ^^<- make value d2[int(k)] on else 
print(new_dict) 
#{'2': 2, '1': 1, 'b': 'b', 'a': 'a', 'c': 'c', '3': 3} 

if k in d1 Обратите внимание, что проверяет k является ключевым в словаре d1. Не нужно вызывать метод keys.

2

Как описано, кажется, что и ваши d1, и d2 являются артефактами того, как вы представляете себе решение проблемы и не являются существенными. Как насчет просто:

>>> dictionary = {k: int(k) if k.isdigit() else k for k in 'abc123'} 
>>> dictionary 
{'b': 'b', '3': 3, '2': 2, '1': 1, 'a': 'a', 'c': 'c'} 
>>> 

Или есть еще проблема, которую вы пытаетесь решить?

+0

Да, на самом деле ключи - это слова из списка, у меня нет простого способа, как метод .isdigit(), чтобы отличить их. Но они отображают либо на d1, либо на d2. –

0

Это общий ответ для понимания словаря с помощью «else». Я столкнулся с этим сообщением, когда искал его в Google, поэтому надеюсь, что он поможет будущим гуглерам.

Так позволяет сказать, что я хочу создать словарь с условием на обоих к и против

наивный способ решить это будет выглядеть примерно так:

{k:v if (condition) else otherk:otherv for k,v in some_dictionary} 

Это не работает, так как упомянутый ранее Моисеем Коледоем.

Однако, вы можете использовать следующие для каждой части:

{k if condition1 else otherK: v if condition2 else otherV for k,v in some_dictionary} 

Обратите внимание, что здесь мы Условная заданию ключа и присвоение значению в. Главное, на что обратить внимание здесь, это расположение разделителя между ключами и значениями. Надеюсь это поможет.

Ниже приведен пример для получения пользовательского словаря в следующем из: для английского алфавита из букв AG будет показывать положительное значение для порядка букв верхнего регистра из букв JZ показывает отрицательное значение для порядка малогабаритных букв

Это пример для разных ключей и значений, основанных на определенном состоянии. Надеюсь, это объясняется достаточно хорошо.

>>> def less_than_H_ascii_val(x): 
...  return x < ord('H')-ord('A') 
... 
>>> {chr(k+ord('A')) if less_than_H_ascii_val(k) else chr(k+ord('a')): 
... k if less_than_H_ascii_val(k) else -k 
... for k in range(26)} 
{'A': 0, 'C': 2, 'B': 1, 'E': 4, 'D': 3, 'G': 6, 'F': 5, 'i': -8, 'h': -7, 'k': -10, 'j': -9, 'm': -12, 'l': -11, 'o': -14, 'n': -13, 'q': -16, 'p': -15, 's': -18, 'r': -17, 'u': -20, 't': -19, 'w': -22, 'v': -21, 'y': -24, 'x': -23, 'z': -25}