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

Я использую значения по умолчанию, за исключением установки предпосылок к немного грязно-белому (#FAFAFA). Я нахожу что это намного менее утомительный на глазах, чем белый фон.

7
задан jfs 15 November 2009 в 15:34
поделиться

5 ответов

Предполагая, что вы говорите о питоне, альтернативный способ сделать это:

return len([x for x in myList if x in myDict]) > 0
1
ответ дан 6 December 2019 в 06:24
поделиться
#!python
any(x in MyDict for x in MyList)
set(MyList).intersection(MyDict)
20
ответ дан 6 December 2019 в 06:24
поделиться

В дополнение к any (элемент в my_dict для элемента в 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 , - n точек соответственно. Пример:

$ python main.py --maxn 65536 --npoints 16
6
ответ дан 6 December 2019 в 06:24
поделиться

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

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

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

0
ответ дан 6 December 2019 в 06:24
поделиться

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

>>> 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
ответ дан 6 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: