2013-11-19 4 views
0
z = [] 
for k, v in b.iteritems(): 
    if v == "Supplementary Assignment, Smith, Bowen": 
     z.append(not k) 

Здравствуйте, я пытаюсь перебрать значения в dict. Целью здесь является z.append() все ключи в 'b', которые не содержат множество значений, определенных для v в инструкции if. Итак, если dict 'b' содержит пару ключ/значение, значение которого было «Смит», тогда этот ключ будет исключен из вызова z.append(), тогда как все остальные ключи будут добавлены. Спасибо за любую помощь, которая приходит мне на ум!Python; Словарь итерация

ответ

8

Вам необходимо протестировать последовательность или установить с помощью теста членства (not in):

z = [] 
for k, v in b.iteritems(): 
    if v not in {"Supplementary", "Assignment", "Smith", "Bowen"}: 
     z.append(k) 

или, более компактный в списке понимание:

z = [key for key, value in b.iteritems() if value not in {"Supplementary", "Assignment", "Smith", "Bowen"}] 

Это перечисляет все ключи в b значение которого не указано в наборе.

Если эффективность цикла имеет первостепенное значение, и вы используете Python версии до того 3.3, затем сохранить набор в локальной переменной и использовать его в петлях:

z = [] 
excluded = {"Supplementary", "Assignment", "Smith", "Bowen"} 
for k, v in b.iteritems(): 
    if v not in excluded: 
     z.append(k) 

или список версия Компа:

excluded = {"Supplementary", "Assignment", "Smith", "Bowen"} 
z = [key for key, value in b.iteritems() if value not in excluded] 

Python 3.3 распознает in {...} или not in {...} синтаксис (с набором) и оптимизирует код, чтобы использовать локальную frozenset() константы для множества буквального.

+0

ОК отлично, спасибо Martijn. Я знал, что близко, но не знал о ключевых словах. Отлично, еще раз спасибо! – philthy

+0

Может быть, неправильно ... но не лучше ли было бы помещать это '{" Дополнительная "," Назначение "," Смит "," Боуэн "} в переменную, чтобы вы не воссоздавали ее несколько раз в список comp? – iCodez

+0

@iCodez: Это постоянный; загрузка происходит довольно быстро. В Python 3.3 и выше он будет * * устанавливать * константу, в версиях до этого он будет загружать строки как константы и выполнять «BUILD_SET» каждую итерацию цикла. Загрузка константы происходит так же быстро, как загрузка локального. –

Смежные вопросы