Python dictionary: получить список значений для списка ключей

Есть ли встроенный / быстрый способ использовать список ключей для словаря для получения списка соответствующих элементов?

Например, у меня есть:

>>> mydict = {'one': 1, 'two': 2, 'three': 3} >>> mykeys = ['three', 'one'] 

Как я могу использовать mykeys для получения соответствующих значений в словаре в виде списка?

 >>> mydict.WHAT_GOES_HERE(mykeys) [3, 1] 

9 Solutions collect form web for “Python dictionary: получить список значений для списка ключей”

Понимание списка – это хороший способ сделать это:

 >>> [mydict[x] for x in mykeys] [3, 1] 

Несколько других способов, чем list-comp:

  • Строить список и map(mydict.__getitem__, mykeys) исключение, если ключ не найден: map(mydict.__getitem__, mykeys)
  • Строить список с None если ключ не найден: map(mydict.get, mykeys)

Альтернативно, использование operator.itemgetter может возвращать кортеж:

 from operator import itemgetter myvalues = itemgetter(*mykeys)(mydict) # use `list(...)` if list is required 

Небольшое сравнение скорости:

 Python 2.7.11 |Anaconda 2.4.1 (64-bit)| (default, Dec 7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)] on win32 In[1]: l = [0,1,2,3,2,3,1,2,0] In[2]: m = {0:10, 1:11, 2:12, 3:13} In[3]: %timeit [m[_] for _ in l] # list comprehension 1000000 loops, best of 3: 762 ns per loop In[4]: %timeit map(lambda _: m[_], l) # using 'map' 1000000 loops, best of 3: 1.66 µs per loop In[5]: %timeit list(m[_] for _ in l) # a generator expression passed to a list constructor. 1000000 loops, best of 3: 1.65 µs per loop In[6]: %timeit map(m.__getitem__, l) The slowest run took 4.01 times longer than the fastest. This could mean that an intermediate result is being cached 1000000 loops, best of 3: 853 ns per loop In[7]: %timeit map(m.get, l) 1000000 loops, best of 3: 908 ns per loop In[33]: from operator import itemgetter In[34]: %timeit list(itemgetter(*l)(m)) The slowest run took 9.26 times longer than the fastest. This could mean that an intermediate result is being cached 1000000 loops, best of 3: 739 ns per loop 

Таким образом, понимание списков и itemgetter – это самые быстрые способы сделать это.

ОБНОВЛЕНИЕ: для больших случайных списков и карт у меня были разные результаты:

 Python 2.7.11 |Anaconda 2.4.1 (64-bit)| (default, Dec 7 2015, 14:10:42) [MSC v.1500 64 bit (AMD64)] on win32 In[2]: import numpy.random as nprnd l = nprnd.randint(1000, size=10000) m = dict([(_, nprnd.rand()) for _ in range(1000)]) from operator import itemgetter import operator f = operator.itemgetter(*l) %timeit f(m) %timeit list(itemgetter(*l)(m)) %timeit [m[_] for _ in l] # list comprehension %timeit map(m.__getitem__, l) %timeit list(m[_] for _ in l) # a generator expression passed to a list constructor. %timeit map(m.get, l) %timeit map(lambda _: m[_], l) 1000 loops, best of 3: 1.14 ms per loop 1000 loops, best of 3: 1.68 ms per loop 100 loops, best of 3: 2 ms per loop 100 loops, best of 3: 2.05 ms per loop 100 loops, best of 3: 2.19 ms per loop 100 loops, best of 3: 2.53 ms per loop 100 loops, best of 3: 2.9 ms per loop 

Таким образом, в этом случае явным победителем является f = operator.itemgetter(*l); f(m) f = operator.itemgetter(*l); f(m) и ясный аутсайдер: map(lambda _: m[_], l) .

Попробуй это:

 mydict = {'one': 1, 'two': 2, 'three': 3} mykeys = ['three', 'one','ten'] newList=[mydict[k] for k in mykeys if k in mydict] print newList [3, 1] 

Вот три способа.

Повышение KeyError когда ключ не найден:

 result = [mapping[k] for k in iterable] 

Значения по умолчанию для отсутствующих ключей.

 result = [mapping.get(k, default_value) for k in iterable] 

Пропуск пропущенных ключей.

 found_keys = mapping.keys() & iterable result = [mapping[k] for k in iterable if k in found_keys] 

Или просто mydict.keys() Это встроенный вызов метода для словарей. Также изучите mydict.values() и mydict.items() .

// Ах, пост ОП путал меня.

Попробуй это:

 mydict = {'one': 1, 'two': 2, 'three': 3} mykeys = {'three', 'one'} # if there are many keys, use a set [v for k, v in mydict.items() if k in mykeys] => [3, 1] 

Вышеупомянутое будет отлично работать в Python 3.x. В Python 2.x это предпочтительнее, поскольку использует итераторы:

 [v for k, v in mydict.iteritems() if k in mykeys] 

После закрытия Python: эффективный способ создания списка из значений dict с заданным порядком

Получение ключей без создания списка:

 from __future__ import (absolute_import, division, print_function, unicode_literals) import collections class DictListProxy(collections.Sequence): def __init__(self, klist, kdict, *args, **kwargs): super(DictListProxy, self).__init__(*args, **kwargs) self.klist = klist self.kdict = kdict def __len__(self): return len(self.klist) def __getitem__(self, key): return self.kdict[self.klist[key]] myDict = {'age': 'value1', 'size': 'value2', 'weigth': 'value3'} order_list = ['age', 'weigth', 'size'] dlp = DictListProxy(order_list, myDict) print(','.join(dlp)) print() print(dlp[1]) 

Выход:

 value1,value3,value2 value3 

Что соответствует порядку, указанному в списке

 reduce(lambda x,y: mydict.get(y) and x.append(mydict[y]) or x, mykeys,[]) 

incase есть ключи не в dict.

  • Список сканирования для 5 последовательных значений больше, чем x
  • Поиск наиболее популярных слов в списке
  • Перебирайте разные списки длин, исключая дубликаты и сохраняя порядок в Python
  • Как вы присоединяетесь ко всем элементам в списке в python
  • как создать словарь, используя два списка в python?
  • Установка пигтта не работает
  • Python: слияние двух списков словарей
  • У python есть отсортированный список?
  • Как искать список кортежей в Python
  • Сложный список slice / index в python
  • Python: список списка фильтров с другим списком
  • Python - лучший язык программирования в мире.