У Dict есть ключ из списка - PullRequest
       18

У Dict есть ключ из списка

7 голосов
/ 15 ноября 2009

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

for i in myList:
   if i in myDict:
      return True
return False

но есть ли более быстрый / более краткий способ?

Ответы [ 5 ]

20 голосов
/ 15 ноября 2009
#!python
any(x in MyDict for x in MyList)
set(MyList).intersection(MyDict)
6 голосов
/ 15 ноября 2009

В дополнение к 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

Измерение относительной производительности

Примеры для рассмотрения:

  1. Элемент с начала списка находится в словаре.
  2. Элемент из конца списка находится в словаре.
  3. Нет элементов из списка в словаре.

Функции для сравнения (см. 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)

key at start

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)

key at end

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)

no key

Как воспроизвести

Скачать main.py , make-figures.py , запустить python main.py (numpy, matplotlib должны быть установлены для создания графиков).

Чтобы изменить максимальный размер списка ввода, количество точек для подачи графика --maxn, --npoints соответственно. Пример: * 1 063 *

$ python main.py --maxn 65536 --npoints 16
1 голос
/ 15 ноября 2009

Это был популярный ответ на связанный вопрос:

>>> if all (k in foo for k in ("foo","bar")):
...     print "They're there!"
...
They're there!

Вы можете настроить его, чтобы проверить, появляется ли что-либо в словаре:

>>> if any(k in myDict for k in ("foo","bar")):
...     print "Found one!"
...
Found one!

Вы можете проверить список ключей:

>>> if any(k in myDict for k in myList):
...     print "Found one!"
...
Found one!
1 голос
/ 15 ноября 2009

Если вы говорите о Python, альтернативный способ сделать это будет:

return len([x for x in myList if x in myDict]) > 0
0 голосов
/ 15 ноября 2009

Спасибо всем большое. Я проверил производительность всех ответов, и самый быстрый был

return len([x for x in myList if x in myDict]) > 0

но я не пробовал "установить" ответ, потому что я не видел, как превратить его в одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...