2009-05-29 3 views
3

Хорошо, я пытаюсь пойти на более питоновский метод делать что-то.Проверка наличия списка в других списках?

Как я могу сделать следующее:

required_values = ['A','B','C'] 
some_map = {'A' : 1, 'B' : 2, 'C' : 3, 'D' : 4} 

for required_value in required_values: 
    if not required_value in some_map: 
     print 'It Doesnt Exists' 
     return False 
return True 

Я смотрел на встроено функцию all, но я не могу реально увидеть, как применить это к вышеуказанному сценарию.

Любые предложения по созданию этого более питонического?

ответ

9
all(value in some_map for value in required_values) 
+0

красивый спасибо – UberJumper

+0

приветствуется. – SilentGhost

+1

Примечание: это будет работать только для списков, состоящих только из хешируемых элементов. В противном случае вы получите исключение TypeError при выполнении «value in some_map» – Triptych

3
return set(required_values).issubset(set(some_map.keys())) 
+2

получается, что поиск ключа dict с «in» (в принятом ответе) намного быстрее, чем извлечение список ключей и преобразование его в набор. –

0

попробовать список понимание:

возвращение не BOOL ([х для й в required_values, если й не в some_map.keys()]) (преобразование BOOL для ясности)

или возвращать не [x для x в required_values, если x не в some_map.keys()] (я думаю, что больше pythonic way)

Оператор inside [] строит список всех необходимых значений, не входящих в ваши ключи карты , если список пуст, он принимает значение False, в противном случае - True.

поэтому, если карта имеет не все требуемые значения, по крайней мере один элемент будет в списке, построенном по выражению понимания списка. Это будет стоить True, поэтому мы отрицаем результат для выполнения ваших требований к коду (все необходимые значения должны присутствовать на карте)

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