В дополнение к any(item in my_dict for item in my_list)
из @ ответа Ронни :
any(map(my_dict.__contains__, my_list)) # Python 3.x
Или:
from itertools import imap
any(imap(my_dict.__contains__, my_list)) # Python 2.x
Измерение относительной производительности
Примеры для рассмотрения:
- Элемент с начала списка находится в словаре.
- Элемент из конца списка находится в словаре.
- Нет элементов из списка в словаре.
Функции для сравнения (см. main.py ):
def mgag_loop(myDict, myList):
for i in myList:
if i in myDict:
return True
return False
def ronny_any(myDict, myList):
return any(x in myDict for x in myList)
def ronny_set(myDict, myList):
return set(myDict) & set(myList)
def pablo_len(myDict, myList):
return len([x for x in myList if x in myDict]) > 0
def jfs_map(my_dict, my_list):
return any(map(my_dict.__contains__, my_list))
def jfs_imap(my_dict, my_list):
return any(imap(my_dict.__contains__, my_list))
Результаты: mgag_loop()
- самый быстрый во всех случаях.
1. Элемент с начала списка находится в словаре.
def args_key_at_start(n):
'Make args for comparison functions "key at start" case.'
d, lst = args_no_key(n)
lst.insert(0, n//2)
assert (n//2) in d and lst[0] == (n//2)
return (d, lst)
2. Элемент из конца списка находится в словаре.
def args_key_at_end(n):
'Make args for comparison functions "key at end" case.'
d, lst = args_no_key(n)
lst.append(n//2)
assert (n//2) in d and lst[-1] == (n//2)
return (d, lst)
3. Нет элементов из списка в словаре.
def args_no_key(n):
'Make args for comparison functions "no key" case.'
d = dict.fromkeys(xrange(n))
lst = range(n, 2*n+1)
assert not any(x in d for x in lst)
return (d, lst)
Как воспроизвести
Скачать main.py , make-figures.py , запустить python main.py
(numpy
, matplotlib
должны быть установлены для создания графиков).
Чтобы изменить максимальный размер списка ввода, количество точек для подачи графика --maxn
, --npoints
соответственно. Пример: * 1 063 *
$ python main.py --maxn 65536 --npoints 16