Использование словаря в качестве звонка

Допустим, я создал словарь и сохранил следующие ключи и значения:

bod = { "Тест1": 12345, "Тест2": 1323242, ... }

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

bof = ["Тест3", "Тест1", "Тест4", "Тест2"]

Можно ли использовать переменную dict в качестве вызова, чтобы сопоставить ее со списком и присвоить значения совпадающих ключей внутри новой переменной, используя следующий код (псевдо)

for l in bof:
    newbof = line.split()
      try:
        newvalues = bod[values]
        print newvalues

person user1743872    schedule 17.10.2012    source источник
comment
Вы можете опубликовать вывод, который хотите, потому что на данный момент это трудно понять.   -  person root    schedule 17.10.2012
comment
Что такое line? Почему у вас есть try без за исключением/наконец?   -  person BrenBarn    schedule 17.10.2012
comment
В чем проблема с кодом? И что это за переменная line?   -  person Rohit Jain    schedule 17.10.2012


Ответы (3)


>>> bod = { "Test1" : 12345, "Test2" : 1323242 }
>>> bof = ["Test3", "Test1", "Test4", "Test2"]
>>> [bod.get(x) for x in bof]
[None, 12345, None, 1323242]

другие варианты

>>> [bod.get(x, 0) for x in bof]
[0, 12345, 0, 1323242]
>>> [bod[x] for x in bof if x in bod]
[12345, 1323242]
person John La Rooy    schedule 17.10.2012
comment
я думаю, что ему не нужны значения None - person Vivek S; 17.10.2012
comment
.get() вернет None, если в словаре нет соответствующего ключа. Вы можете попросить его вернуть любое другое значение по умолчанию, например bod.get(x,0). Это позволяет избежать исключения KeyError (именно для этого, как я подозреваю, было try в вопросе ОП). - person Burhan Khalid; 17.10.2012
comment
@InternalServerError, я думаю, что вопрос не указывает в любом случае - person John La Rooy; 17.10.2012
comment
@gnibbler присваивает значения совпадающих ключей внутри новой переменной, поэтому он хочет, чтобы внутри новой переменной были только совпадающие ключи. - person Vivek S; 17.10.2012

Не могу полностью понять ваш вопрос, насколько я понимаю,

newvalues=[]
for i in bof:
  if bod.get(i):
    newvalues.append(bod[i])
print newvalues

оптимизированный,

newvalues=[bod[i] for i in bof if bod.get(i)]
person Vivek S    schedule 17.10.2012
comment
if i in bod более оптимизирован, чем if bod.get(i). Также работает корректно, если bod[i] == 0 - person John La Rooy; 17.10.2012

насколько я понимаю:

In [325]: bod = { "Test1" : 12345, "Test2" : 1323242}

In [326]: bof = ["Test3", "Test1", "Test4", "Test2"]

In [327]: [bod[i ]for i in bof if i in bod]
Out[327]: [12345, 1323242]

или если вы хотите сохранить значения не в теле:

In [332]: [bod[x] if x in bod else x for x in bof]
Out[332]: ['Test3', 12345, 'Test4', 1323242]

or

[bod.get(x,x) for x in bof]
Out[333]: ['Test3', 12345, 'Test4', 1323242]

Также обратите внимание, что хотя использование get более лаконично, использование in быстрее:

In [337]: % timeit [bod[x] if x in bod else x for x in bof]
1000000 loops, best of 3: 1.39 us per loop

In [338]: % timeit [bod.get(x,x) for x in bof]
100000 loops, best of 3: 1.88 us per loop
person root    schedule 17.10.2012