Python - вернуть первый N ключ: значение пары из dict - PullRequest
67 голосов
/ 01 ноября 2011

Рассмотрим следующий словарь, d:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

Я хочу вернуть первые N пар ключ-значение из d (N <= 4 в этом случае). Какой самый эффективный способ сделать это? </p>

Ответы [ 12 ]

78 голосов
/ 01 ноября 2011

Нет такой вещи, как «первые n» ключей, потому что dict не помнит, какие ключи были вставлены первыми.

Вы можете получить любую n пар ключ-значениехотя:

n_items = take(n, d.iteritems())

Используется реализация take из itertools рецептов :

from itertools import islice

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

Смотрите, как работает онлайн: ideone

61 голосов
/ 19 октября 2012

Очень эффективный способ получить что-либо - это объединить списки или словари с нарезкой.Если вам не нужно упорядочивать элементы (вы просто хотите n случайных пар), вы можете использовать словарное понимание следующим образом:

# Python 2
first2pairs = {k: mydict[k] for k in mydict.keys()[:2]}
# Python 3
first2pairs = {k: mydict[k] for k in list(mydict)[:2]}

Как правило, такое понимание всегда выполняется быстрее, чем эквивалентный"для х в у" цикл.Кроме того, используя .keys () для составления списка ключей словаря и нарезки этого списка, вы избегаете «касания» ненужных клавиш при создании нового словаря.

Если вам не нужны ключи (только значения), вы можете использовать понимание списка:

first2vals = [v for v in mydict.values()[:2]]

Если вам нужны значения, отсортированные по их ключам, это не намногопроблема:

first2vals = [mydict[k] for k in sorted(mydict.keys())[:2]]

или если вам также нужны ключи:

first2pairs = {k: mydict[k] for k in sorted(mydict.keys())[:2]}
9 голосов
/ 01 ноября 2011

Python dict не упорядочены, поэтому бессмысленно просить "первые N" клавиш.

Класс collections.OrderedDict доступен, если это то, что вам нужно.Вы могли бы эффективно получить его первые четыре элемента, так как

import itertools
import collections

d = collections.OrderedDict((('foo', 'bar'), (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')))
x = itertools.islice(d.items(), 0, 4)

for key, value in x:
    print key, value

itertools.islice позволяет вам лениво брать часть элементов из любого итератора.Если вы хотите, чтобы результат был многоразовым, вам нужно преобразовать его в список или что-то вроде этого:

x = list(itertools.islice(d.items(), 0, 4))
5 голосов
/ 20 сентября 2017
foo = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
iterator = iter(foo.items())
for i in range(3):
    print(next(iterator))

По сути, превратить представление (dict_items) в итератор, а затем повторить его с помощью next ().

4 голосов
/ 27 января 2016

Не видел здесь. Не будет упорядочено, но синтаксически проще всего, если вам нужно просто взять некоторые элементы из словаря.

n = 2
{key:value for key,value in d.items()[0:n]}
3 голосов
/ 01 ноября 2011

См. PEP 0265 в словарях сортировки. Затем используйте вышеупомянутый итеративный код.

Если вам нужно больше эффективности в отсортированных парах ключ-значение. Используйте другую структуру данных. То есть тот, который поддерживает отсортированный порядок и ассоциации ключ-значение.

1007 * Е.Г. *

import bisect

kvlist = [('a', 1), ('b', 2), ('c', 3), ('e', 5)]
bisect.insort_left(kvlist, ('d', 4))

print kvlist # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
1 голос
/ 01 ноября 2011

Это зависит от того, что «наиболее эффективно» в вашем случае.

Если вам нужна просто случайная выборка огромного словаря foo, используйте foo.iteritems() и извлекайте из него столько значений, сколько вам нужно, это ленивая операция, позволяющая избежать явного списка ключей или элементов. ,

Если вам нужно сначала отсортировать ключи, нет никакого способа использовать что-то вроде keys = foo.keys(); keys.sort() или sorted(foo.iterkeys()), вам придется составить явный список ключей. Затем нарежьте или переберите первый N keys.

Кстати, почему вы заботитесь о «эффективном» способе? Вы профилировали свою программу? Если вы этого не сделали, сначала используйте очевидный и простой для понимания способ . Скорее всего, все будет хорошо, не став узким местом.

0 голосов
/ 12 апреля 2019

просто добавьте ответ, используя zip,

{k: d[k] for k, _ in zip(d, range(n))}
0 голосов
/ 08 февраля 2019

считают диктом

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

from itertools import islice
n = 3
list(islice(d.items(),n))

Айлис сделает свое дело :) надеюсь, это поможет!

0 голосов
/ 03 ноября 2017

Для Python 3 и выше, чтобы выбрать первые n пар

n=4
firstNpairs = {k: Diction[k] for k in list(Diction.keys())[:n]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...