Jak wyodrębnić pojedynczą parę klucz-wartość w zmiennych

Mam tylko jedną parę klucz-wartość w słowniku. Chcę przypisać klucz do jednej zmiennej i jest to wartość do innej zmiennej. Próbowałem z poniższymi sposobami, ale dostaję błąd dla tego samego.

>>> d = {"a": 1}

>>> d.items()
[('a', 1)]

>>> (k, v) = d.items()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

>>> (k, v) = list(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

Wiem, że możemy wyodrębnić klucz i wartość jeden po drugim, lub za pomocą pętli for I iteritems(), ale czy nie ma prostego sposobu, aby przypisać oba w jednej instrukcji?

Author: Georgy, 2013-11-22

10 answers

Dodaj kolejny poziom, z krotką (tylko przecinkiem):

(k, v), = d.items()

Lub z listą:

[(k, v)] = d.items()

Lub wybierz pierwszy element:

k, v = d.items()[0]

Pierwsze dwa mają tę dodatkową zaletę, że rzucają wyjątek, jeśli twój słownik ma więcej niż jeden klucz, i oba działają na Pythonie 3, podczas gdy ten drugi musiałby być napisany jako k, v = next(iter(d.items())), aby zadziałał.

Demo:

>>> d = {'foo': 'bar'}
>>> (k, v), = d.items()
>>> k, v
('foo', 'bar')
>>> [(k, v)] = d.items()
>>> k, v
('foo', 'bar')
>>> k, v = d.items()[0]
>>> k, v
('foo', 'bar')
>>> k, v = next(iter(d.items()))  # Python 2 & 3 compatible
>>> k, v
('foo', 'bar')
 79
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-22 11:13:58

items() zwraca listę krotek TAK:

(k,v) = d.items()[0]
 5
Author: Farhadix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 13:19:33
>>> d = {"a":1}
>>> [(k, v)] = d.items()
>>> k
'a'
>>> v
1

Lub za pomocą next, iter:

>>> k, v = next(iter(d.items()))
>>> k
'a'
>>> v
1
>>>
 4
Author: falsetru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 13:19:33
d = {"a": 1}

You can do

k, v = d.keys()[0], d.values()[0]

d.keys() zwróci listę wszystkich kluczy i d.values() zwróci listę wszystkich wartości, ponieważ masz jedną parę key: value w d uzyskasz dostęp do pierwszego elementu listy kluczy i wartości

 3
Author: its me,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-01 14:29:43

Jest to najlepsze rozwiązanie, jeśli masz wiele pozycji w słowniku, ponieważ w rzeczywistości nie tworzy on listy, ale daje tylko jedną parę klucz-wartość.

k, v = next(d.iteritems())

Oczywiście, jeśli masz więcej niż jedną pozycję w słowniku, nie ma sposobu, aby wiedzieć, który z nich wyjdziesz.

 2
Author: kindall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 14:29:46

Masz listę. Aby uzyskać dostęp do elementów, musisz zindeksować listę.

(k,v) = d.items()[0]
 1
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 13:19:29

W Pythonie 3:

Krótka odpowiedź:

[(k, v)] = d.items()

Lub:

(k, v) = list(d.items())[0]

Lub:

(k, v), = d.items()

Długa odpowiedź:

d.items(), zasadniczo (ale nie w rzeczywistości) daje listę z krotką, która ma 2 wartości, które będą wyglądać tak po wydrukowaniu:

dict_items([('a', 1)])

Możesz przekonwertować ją na aktualną listę, zawijając ją za pomocą list(), co spowoduje taką wartość:

[('a', 1)]
 1
Author: Eduard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-01 14:30:29

Użyj metody .popitem().

k, v = d.popitem()
 1
Author: Pyprohly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-01 15:33:51

Jeśli chcesz tylko klucz słownikowy i nie dbasz o wartość, zauważ, że (key, ), = foo.items() nie działa. Musisz przypisać tę wartość do zmiennej.

Więc potrzebujesz (key, _), = foo.items()

Ilustracja w Pythonie 3.7.2:

>>> foo = {'a': 1}
>>> (key, _), = foo.items()
>>> key
'a'
>>> (key, ), = foo.items()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 1)
 0
Author: KevinG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-28 21:46:04
key = list(foo.keys())[0]
value = foo[key]
 0
Author: Kamlakar Ravindra Bhopatkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-22 18:52:15