Рассмотрим следующий словарь, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Я хочу вернуть первые N пар ключ: значение из d (в данном случае N <= 4). Какой метод для этого наиболее эффективен?
python
dictionary
Джейсон Стримпель
источник
источник
list(d.items())[:4]
. list () является базовой реализацией для многих ответов.Ответы:
Не существует такой вещи, как "первые n" ключей, потому что a
dict
не помнит, какие ключи были вставлены первыми.Однако вы можете получить любые n пар ключ-значение:
Здесь используется реализация
take
изitertools
рецептов :Посмотрите, как это работает в Интернете: ideone
Обновление для Python 3.6
источник
iteritems
следует заменить наitems
для людей на Python 3take()
ли где-нибудь часть базы кода Python? Или это просто функция, которую вы определили здесь в своем ответе? Спрашивая, как будто это часть базы кода, я не могу его найти / импортировать. :)Очень эффективный способ получить что-либо - объединить понимание списка или словаря с нарезкой. Если вам не нужно заказывать элементы (вам просто нужно n случайных пар), вы можете использовать понимание словаря следующим образом:
Обычно подобное понимание всегда выполняется быстрее, чем эквивалентный цикл «for x in y». Кроме того, используя .keys () для создания списка ключей словаря и нарезки этого списка, вы избегаете «касания» любых ненужных ключей при создании нового словаря.
Если вам не нужны ключи (только значения), вы можете использовать понимание списка:
Если вам нужны значения, отсортированные по их ключам, это не проблема:
или, если вам нужны ключи:
источник
dict
S Python не упорядочены, поэтому бессмысленно запрашивать «первые N» ключей.collections.OrderedDict
Класс доступен , если это то, что вам нужно. Вы можете эффективно получить его первые четыре элемента какitertools.islice
позволяет вам лениво брать срез элементов из любого итератора. Если вы хотите, чтобы результат можно было использовать повторно, вам нужно преобразовать его в список или что-то в этом роде, например:источник
По сути, превратите представление (dict_items) в итератор, а затем повторите его с помощью next ().
источник
Не видел его здесь. Не будет упорядочен, но синтаксически простейший, если вам нужно просто взять какие-то элементы из словаря.
источник
TypeError: 'dict_items' object is not subscriptable
{key:value for key,value in stocks.items()[0:n]}
(акции - это название моего словаря)Чтобы получить верхние N элементов из вашего словаря Python, можно использовать следующую строку кода:
В вашем случае вы можете изменить его на:
источник
См. PEP 0265 о сортировке словарей. Затем используйте вышеупомянутый повторяющийся код.
Если вам нужно больше эффективности в отсортированных парах "ключ-значение". Используйте другую структуру данных. То есть тот, который поддерживает отсортированный порядок и ассоциации "ключ-значение".
Например
источник
в py3 это поможет
{'a': 3, 'b': 2, 'c': 3, 'd': 4}
источник
просто добавьте ответ, используя zip,
источник
Это зависит от того, что «наиболее эффективно» в вашем случае.
Если вам просто нужна полуслучайная выборка из огромного словаря
foo
, используйтеfoo.iteritems()
и берите из нее столько значений, сколько вам нужно, это ленивая операция, которая позволяет избежать создания явного списка ключей или элементов.Если вам нужно сначала отсортировать ключи, нет способа использовать что-то вроде
keys = foo.keys(); keys.sort()
илиsorted(foo.iterkeys())
, вам придется создать явный список ключей. Затем нарезать или итерация через первую Nkeys
.Кстати, почему вас волнует «эффективный» способ? Вы профилировали свою программу? Если вы этого не сделали, используйте сначала очевидный и простой для понимания способ. Скорее всего, он будет работать хорошо, но не станет узким местом.
источник
Вы можете подойти к этому несколькими способами. Если порядок важен, вы можете сделать это:
Если порядок не является проблемой, вы можете сделать это:
источник
value
а неitem
для ясности.Словарь не поддерживает порядок, поэтому, прежде чем выбирать верхние N пар ключ-значение, давайте отсортируем его.
Теперь мы можем извлечь верхние N элементов :, используя такую структуру метода:
чтобы получить 2 верхних элемента, просто используйте эту структуру:
источник
Для Python 3 и выше, чтобы выбрать первые n пар
источник
считать диктат
islice сделает свое дело :) надеюсь, что это поможет!
источник
Это может быть не очень элегантно, но у меня работает:
источник
Я попробовал несколько ответов выше и заметил, что некоторые из них зависят от версии и не работают в версии 3.7.
Также отмечу, что начиная с версии 3.6 все словари упорядочены по последовательности вставки элементов.
Несмотря на то, что словари упорядочены, начиная с версии 3.6, некоторые из операторов, которые вы ожидаете работать с упорядоченными структурами, похоже, не работают.
Ответ на вопрос OP, который лучше всего сработал для меня.
источник
lst = list(d.items())[:N]
Необычный подход, так как он выдает интенсивную временную сложность O (N).
источник