Доступ к произвольному элементу в словаре в Python - PullRequest
442 голосов
/ 23 июня 2010

Если mydict не пустой, я получаю доступ к произвольному элементу как:

mydict[mydict.keys()[0]]

Есть ли лучший способ сделать это?

Ответы [ 15 ]

525 голосов
/ 23 июня 2010

На Python 3, неразрушающе и итеративно:

next(iter(mydict.values()))

На Python 2, неразрушающе и итеративно:

mydict.itervalues().next()

Если вы хотите, чтобы он работал как в Python 2, так и в 3, вы можете использовать пакет six:

six.next(six.itervalues(mydict))

хотя на данный момент это довольно загадочно, и я бы предпочел ваш код.

Если вы хотите удалить какой-либо элемент, выполните:

key, value = mydict.popitem()

Обратите внимание, что «первый» здесь не подходит. Это «любой» элемент, потому что dict не упорядоченный тип.

121 голосов
/ 13 июня 2013

Если вам нужен доступ только к одному элементу (будучи первым случайно, поскольку диктовки не гарантируют порядок), вы можете просто сделать это в Python 2 :

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

Обратите внимание, что (насколько мне известно) Python не гарантирует, что 2 последовательных вызова любого из этих методов вернут список с одинаковым порядком. Это не поддерживается с Python3.

56 голосов
/ 26 сентября 2014

В python3, путь:

dict.keys() 

возвращает значение типа: dict_keys (), мы получим ошибку, когда получим 1-й член ключей dict следующим образом:

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

Наконец, я конвертирую dict.keys () в список @ 1-й и получаю 1-го члена методом сращивания списка:

list(dict.keys())[0]
25 голосов
/ 02 сентября 2016

чтобы получить ключ

next(iter(mydict))

чтобы получить значение

next(iter(mydict.values()))

чтобы получить оба

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

Первые два - Python 2 и 3. Последние два ленивы в Python 3, но не в Python 2.

16 голосов
/ 23 июня 2010

Как уже упоминалось, «первого элемента» не существует, поскольку словари не имеют гарантированного порядка (они реализованы в виде хеш-таблиц). Если вы хотите, например, значение, соответствующее наименьшему ключу, thedict[min(thedict)] сделает это. Если вы заботитесь о порядке, в котором ключи были вставлены, то есть «первым» вы подразумеваете «вставлено раньше», то в Python 3.1 вы можете использовать collection.OrderedDict , который также находится в готовящемся выпуске Python. 2,7; для более старых версий Python загрузите, установите и используйте упорядоченный обратный порт dict (2.4 и более поздние версии), который вы можете найти здесь .

Python 3,7 Теперь диктанты упорядочены по вставке.

13 голосов
/ 21 января 2016

Как насчет этого.Здесь пока не упоминается.

py 2 & 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
12 голосов
/ 23 июня 2010

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

next(dict.itervalues())

Таким образом мы избегаем поиска элементов и генерируем список ключей, которые мы не используем.

Python3

next(iter(dict.values()))
8 голосов
/ 20 января 2016

В python3

list(dict.values())[0]
3 голосов
/ 07 января 2015

Для Python 2 и 3:

import six

six.next(six.itervalues(d))
3 голосов
/ 07 декабря 2010

Вы всегда можете сделать:

for k in sorted(d.keys()):
    print d[k]

Это даст вам последовательно отсортированный (относительно встроенный .hash (), я думаю) набор ключей, которые вы можете обрабатывать, еслисортировка имеет какое-то значение для вас.Это означает, например, что числовые типы сортируются последовательно, даже если вы расширяете словарь.

ПРИМЕР

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

Обратите внимание, что словарь сортируется при печати.Но набор ключей по сути является хэш-картой!

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