Если a mydict
не пусто, я получаю доступ к произвольному элементу как:
mydict[mydict.keys()[0]]
Есть ли лучший способ сделать это?
list(mydict.keys())[0]
.
Если a mydict
не пусто, я получаю доступ к произвольному элементу как:
mydict[mydict.keys()[0]]
Есть ли лучший способ сделать это?
list(mydict.keys())[0]
.
Ответы:
На Python 3, неразрушающе и итеративно:
next(iter(mydict.values()))
На Python 2, неразрушающе и итеративно:
mydict.itervalues().next()
Если вы хотите, чтобы он работал как в Python 2, так и в 3, вы можете использовать six
пакет:
six.next(six.itervalues(mydict))
хотя на данный момент это довольно загадочно, и я бы предпочел ваш код.
Если вы хотите удалить какой-либо элемент, выполните:
key, value = mydict.popitem()
Обратите внимание, что «first» может быть не подходящим термином, потому что dict
это не упорядоченный тип в Python <3.6. Python 3.6+ dicts
заказаны.
dict.iterkeys().next()
?
dict.values().__iter__().__next__()
:)
key, value = dict(d).popitem()
Если вам нужно получить доступ только к одному элементу (будучи первым случайно, поскольку диктовки не гарантируют порядок), вы можете просто сделать это в 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
list(my_dict.keys())[0]
list(my_dict.keys())[0]
не ленивый?
В python3, кстати:
dict.keys()
вернуть значение в типе: dict_keys (), мы получим ошибку, когда получим 1-й член ключей dict следующим образом:
dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Наконец, я конвертирую dict.keys () в list @ 1st и получаю 1-го члена методом сращивания списка:
list(dict.keys())[0]
list(dict.values())[0]
.
Как уже упоминалось, «первого элемента» не существует, поскольку словари не имеют гарантированного порядка (они реализованы в виде хеш-таблиц). Если вы хотите, например, значение, соответствующее наименьшему ключу, thedict[min(thedict)]
будет делать это. Если вас волнует порядок, в котором ключи были вставлены, то есть «первым» вы подразумеваете «вставленный раньше», то в Python 3.1 вы можете использовать collection.OrderedDict , который также будет в готовящемся Python 2.7; для более старых версий Python загрузите, установите и используйте упорядоченный обратный порт dict (2.4 и более поздние версии), который вы можете найти здесь .
Python 3.7 Теперь дикты упорядочены по вставке.
Как насчет этого. Здесь еще не упоминается.
пи 2 и 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
dict.values()
возвращает представление, поэтому должно быть O (1). list(a)
возвращает новый список, поэтому будет O (n).
Не обращая внимания на вопросы, связанные с порядком выбора, это может быть лучше:
next(dict.itervalues())
Таким образом мы избегаем поиска элементов и генерируем список ключей, которые мы не используем.
next(iter(dict.values()))
next(iter(dict.values()))
получить тот же результат без создания списка.
В python3
list(dict.values())[0]
Вы всегда можете сделать:
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())
Обратите внимание, что словарь сортируется при печати. Но набор ключей по сути является хэш-картой!
Для Python 2 и 3:
import six
six.next(six.itervalues(d))
Is there any better way to do this?
вкратце.
first_key, *rest_keys = mydict
Нет внешних библиотек, работает на Python 2.7 и 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
Для ключа aribtrary просто не указывайте .values ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
Создание подклассов 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'