Подтвердить что ты не робот

Доступ к произвольному элементу в словаре в Python

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

mydict[mydict.keys()[0]]

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

4b9b3361

Ответ 1

На 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 не является упорядоченным типом.

Ответ 2

Если вам нужен только один элемент (будучи первым случайно, поскольку диктовки не гарантируют порядок), вы можете просто сделать это в 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.

в Python 3:

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

Ответ 3

В python3, способ:

dict.keys() 

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

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

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

list(dict.keys())[0]

Ответ 4

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

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.

Ответ 5

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

Python 3.7 Теперь dicts упорядочивается вставки.

Ответ 6

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

py 2 и 3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2

Ответ 7

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

next(dict.itervalues())

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

python3

next(iter(dict.values()))

Ответ 8

В python3

list(dict.values())[0]

Ответ 9

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

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())

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

Ответ 10

Для обоих Python 2 и 3:

import six

six.next(six.itervalues(d))

Ответ 11

Самый простой способ для python3:

list(dict.keys())[0]

Ответ 12

first_key, *rest_keys = mydict

Ответ 13

Обновление ответа @swK, основанное на комментарии @alldayremix:

В Python 3 используйте:

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

Ответ 14

Нет внешних библиотек, работает как на Python 2.7, так и на 3.x:

>>> list(set({"a":1, "b": 2}.values()))[0]
1

Для произвольного ключа просто оставьте значение .values ​​()

>>> list(set({"a":1, "b": 2}))[0]
'a'

Ответ 15

Subclassing dict - один из методов, хотя и не эффективный. Здесь, если вы поместите целое число, оно вернет d[list(d)[n]], в противном случае доступ к словарю, как ожидалось:

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'