Если mydict
не пуст, я обращаюсь к произвольному элементу как:
mydict[mydict.keys()[0]]
Есть ли лучший способ сделать это?
Если mydict
не пуст, я обращаюсь к произвольному элементу как:
mydict[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()
Обратите внимание, что "первый" здесь не является подходящим термином. Это "любой" элемент, потому что dict
не является упорядоченным типом.
Если вам нужен только один элемент (будучи первым случайно, поскольку диктовки не гарантируют порядок), вы можете просто сделать это в 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
В 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]
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.
Как уже упоминалось, нет "первого элемента", поскольку словари не имеют гарантированного порядка (они реализованы как хеш-таблицы). Если вы хотите, например, значение, соответствующее наименьшему ключу, то это thedict[min(thedict)]
. Если вам небезразличен порядок, в который были вставлены ключи, т.е. Под "первым" вы подразумеваете "вставленный раньше", то в Python 3.1 вы можете использовать collections.OrderedDict, который также находится в предстоящем Python 2.7; для более старых версий Python, загрузите, установите и используйте упорядоченный файл dict backport (2.4 и более поздние версии), который вы можете найти здесь.
Python 3.7 Теперь dicts упорядочивается вставки.
Как насчет этого. Не упоминается здесь.
py 2 и 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
Игнорируя проблемы, связанные с упорядочением диктов, это может быть лучше:
next(dict.itervalues())
Таким образом мы избегаем поиска элементов и генерируем список ключей, которые мы не используем.
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())
Обратите внимание, что словарь распечатывается при печати. Но набор клавиш - это, по существу, hashmap!
Для обоих Python 2 и 3:
import six
six.next(six.itervalues(d))
Самый простой способ для python3:
list(dict.keys())[0]
first_key, *rest_keys = mydict
Обновление ответа @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
Нет внешних библиотек, работает как на Python 2.7, так и на 3.x:
>>> list(set({"a":1, "b": 2}.values()))[0]
1
Для произвольного ключа просто оставьте значение .values ()
>>> list(set({"a":1, "b": 2}))[0]
'a'
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'