Якщо а mydict
не порожній, я отримую доступ до довільного елемента як:
mydict[mydict.keys()[0]]
Чи є кращий спосіб зробити це?
list(mydict.keys())[0]
.
Якщо а 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 не гарантує, що два послідовних дзвінки на будь-який із цих методів повернуть список із тим самим замовленням. Це не підтримується з 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 () у список @ 1st та отримую 1-го члена за методом списку сплайсів:
list(dict.keys())[0]
list(dict.values())[0]
.
Як згадували інші, "першого елемента" немає, оскільки словники не мають гарантованого порядку (вони реалізовані як хеш-таблиці). Якщо ви хочете, наприклад, значення, що відповідає найменшому ключу, thedict[min(thedict)]
зробимо це. Якщо ви дбаєте про порядок введення ключів, тобто під "спочатку" ви маєте на увазі "вставлено якнайшвидше", то в Python 3.1 ви можете використовувати collection.OrderedDict , який також знаходиться в майбутньому Python 2.7; для старих версій Python завантажте, встановіть і використовуйте впорядкований репортаж (2.4 і пізніші версії), який ви можете знайти тут .
Python 3.7 Тепер дикти впорядковані.
Як щодо цього. Тут ще не згадується.
py 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()))
отримати той же результат, не створюючи список.
Ви завжди можете:
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
Для атрибутивного ключа просто залиште .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'