Як я можу перетворити словник у список кортежів?


219

Якщо у мене є словник типу:

{ 'a': 1, 'b': 2, 'c': 3 }

Як я можу це перетворити на це?

[ ('a', 1), ('b', 2), ('c', 3) ]

І як я можу це перетворити на це?

[ (1, 'a'), (2, 'b'), (3, 'c') ]

7
[tuple(reversed(x)) for x in d.items()]
гарей

1
@garej: Враховуючи, що xце вже є tupleу вашому коді (це характер itemsстворення ітерабелів tuples), було б простіше / швидше це зробити [x[::-1] for x in d.items()]; реверсивний зріз безпосередньо конструює реверс tupleналежного розміру, а не має tupleконструктор ітеративно заповнювати (із перерозподілом та зміною розміру в кінці) a tupleз reversedітератора.
ShadowRanger

@ShadowRanger, ти маєш рацію. Мені просто хотілося чітко сказати, що k, vв таких випадках не завжди потрібна модель.
garej

Примітка: доданий compatibilityтег через різниці py2.x // py3.x
dreftymac

Відповіді:


360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

Це не в тому порядку, який ви хочете, але дикти так і не мають конкретного порядку. 1 Сортуйте його або організуйте за потребою.

Дивіться: items () , iteritems ()


У Python 3.x ви б не використовували iteritems(якого більше не існує), а натомість використовуєте items, що тепер повертає "погляд" у елементи словника. Див . Новий документ для Python 3.0 та нову документацію про представлення даних .

1: Збереження порядку вставки для диктів було додано в Python 3.7


8
items () повертає перегляд dict_keys у python3. Оберніть цей виклик із закликом до списку "list ()". Дивіться відповідь @ SilentGhost
Еріх

55

оскільки ніхто більше не робив, я додаю версії py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]


10

Створіть список названих пар

Часто може бути дуже зручно використовувати nametuple . Наприклад, у вас є словник "name" як клавіш, а "score" - такі значення, як:

d = {'John':5, 'Alex':10, 'Richard': 7}

Ви можете перелічити предмети як кортежі, відсортовані за вашим бажанням, і отримати ім’я та оцінка, скажімо, гравець з найвищим балом (індекс = 0) дуже пітонічно такий:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

Як це зробити:

список у довільному порядку або порядку збереження колекцій. OrdDict :

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

у порядку, відсортованому за значенням ('бал'):

import collections
Player = collections.namedtuple('Player', 'score name')

відсортовано першим з найнижчим балом:

worst = sorted(Player(v,k) for (k,v) in d.items())

відсортовано першим найвищим балом:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7

Те , що ви хочете , це dict«s items()і iteritems()методи. itemsповертає список (ключ, значення) кортежів. Оскільки кортежі незмінні, їх неможливо повернути. Таким чином, вам слід перебрати елементи та створити нові кортежі, щоб отримати зворотні (значення, ключові) кортежі. Для ітерації iteritemsбажано, оскільки він використовує генератор для отримання (ключ, значення) кортежів, а не необхідність зберігати весь список у пам'яті.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 


5

Це переломні зміни від Python 3.x та Python 2.x

Для використання Python3.x

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Для використання Python 2.7

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

4
>>> a = {'a': 1, 'b': 2, 'c': 3}

>>> [(x, a [x]) для x у a.keys ()]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a [x], x) для x у a.keys ()]
[(1, 'a'), (3, 'c'), (2, 'b')]

4

До keys()і values()методи словника і zip.

zip поверне список кортежів, який діє як упорядкований словник.

Демонстрація:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]

Це працювало для мене як альтернатива тому, collections.OrderedDict()що краще працює з декількома версіями Python HTTP Requests lib. Навіть не дивлячись на те, що zipім’я функції я не люблю як дещо розпливчасте / перевантажене.
MarkHu

Зауважте, що zipкласифікація не є "глибоким" кастингом, тобто, якщо є вкладені діти, вони не будуть впливати. Можливо, вам доведеться прокрутити власну рекурсію.
MarkHu

3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list

2
Хоча цей код може допомогти вирішити проблему, він не пояснює чому та / або як він відповідає на питання. Забезпечення цього додаткового контексту значно підвищило б його довгострокове навчальне значення. Будь ласка , змініть свій відповідь , щоб додати пояснення, в тому числі те , що застосовувати обмеження і допущення.
Toby Speight

3

Більш простий був би

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

Другий не простіший, але так.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.