Python: Что не так с пониманием словаря? - PullRequest
0 голосов
/ 31 января 2012

Мой код:

dict( (k,v) if k in ['1','2','3','4'] else (k,None)  for k,v in {'1':'one','2':'two'}.items() )

Ожидаемый результат:

{'1': 'one', '2': 'two', '3':None, '4':None}

Фактический результат:

{'1': 'one', '2': 'two'}

Пожалуйста, помогите!

Ответы [ 5 ]

8 голосов
/ 31 января 2012

Предложение for содержит только 2 элемента, поэтому в вашем конечном диктанте будет только 2 элемента.Список из 4 пунктов используется только для сравнения, а не в качестве источника значений для использования.

6 голосов
/ 31 января 2012
if k in ['1','2','3','4']

- это условие, а не итерация (см. if).

Вы можете написать это как:

dict((k, {'1':'one','2':'two'}.get(k, None)) for k in ['1','2','3','4'])

# returns: {'1': 'one', '2': 'two', '3': None, '4': None}
4 голосов
/ 31 января 2012

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

theDict = {'1':'one','2':'two'}
s = dict( (k,theDict[k]) if k in theDict else (k,None)  for k in ['1','2','3','4'] )
2 голосов
/ 31 января 2012

вы перебираете dict с двумя ключами, а не 4-элементным списком

мой код:

dict( (k, {'1':'one', '2':'two'}.get(k, None)) for k in ['1', '2','3', '4'])
0 голосов
/ 31 января 2012

Если бы мой хрустальный шар не был разбит, я бы предположил, что вам нужно другое направление: переберите k по списку и проверьте, есть ли оно в словаре.

В этом случае вам может пригодиться

l = ['1', '2', '3', '4']
testdict = {'1': 'one', '2': 'two'}
res = dict((k, testdict.get(k, None)) for k in l)

Итерируется по l и возвращает кортеж (k, testdict[k]), если k находится в testdict. Если нет, то выдает (k, None) - именно так, как вы (предположительно!) Хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...