2015-07-15 5 views
2

Существует ДИКТ,Как использовать список Python понимания с условным выражением

dlist = [{'Bilbo' : 'Ian', 'Frodo' : 'Elijah'}, {'Bilbo' : 'Martin', 'Thorin' : 'Richard'}] 

И пусть k = 'Frodo'

Я хочу, чтобы извлечь значение, соответствующее K, если она существует, и составьте список.

Я написал

value_list = [dlist[i][k] for i in range(len(dlist)) if k in dlist[i] else "NOT PRESENT"]. 

Но компьютер говорит else неправильно. Я не знаю почему.

+2

Попробуйте это - '[DList [я] [к], если к в DList [я] еще "НЕТ" для г в диапазоне (len (dlist))] .' – Kamehameha

+0

На самом деле в списке есть два диктата. – Alexander

ответ

4

Когда вы else часть в списке понимание, довести его до того, как цикл, пример -

value_list = [dlist[i][k] if k in dlist[i] else "NOT PRESENT" for i in range(len(dlist))] 
value_list 
>>> ['Elijah', 'NOT PRESENT'] 
+0

Это работает !! Спасибо! –

+0

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

+0

Рад быть полезным. –

4

if после for в списке понимание для фильтрации списка: если условие ложно вы вообще нет элемента.

if..else до понимания списка - просто тернарный оператор, отличный от любого другого выражения.

Еще пара других пунктов: for i in range(len(...)) почти всегда ошибочен в Python. Если вы только перебираете один список, просто перебирайте его. Кроме того, словари имеют способ .get(), который вы можете использовать, чтобы избежать вообще if. Итак:

value_list = [d.get(k, "NOT PRESENT") for d in dlist] 

или, если вы предпочитаете if:

value_list = [d[k] if k in d else "NOT PRESENT" for d in dlist] 
+0

Благодарим вас за ответ. Но почему «for i in range (len (...))« неправильно для повторения одного списка в python? и в чем смысл «перебирать это»? –

+0

@JihoBaek Они означали, что вы можете переписать 'dlist [i] [k] для i в диапазоне (len (dlist))' только для 'd [k] для d в dlist', так как' d' будет ссылаться на каждый элемент списка, когда он выполняет итерацию, вместо использования 'i' в качестве индекса. – SuperBiasedMan

+0

@SuperBiasedMan oh! Я понял! благодаря –