Могу ли я сохранить словари в виде списков? [Дубликат]

Два наиболее распространенных способа доступа к свойствам в JavaScript - это точка и квадратные скобки. И value.x and value[x] получают доступ к свойству по значению, но не обязательно к одному и тому же свойству. Разница заключается в том, как интерпретируется х. При использовании точки точка после точки должна быть допустимым именем переменной, и она непосредственно называет это свойство. При использовании квадратных скобок выражение между скобками оценивается для получения имени свойства. В то время как value.x получает свойство value с именем «x», значение [x] пытается оценить выражение x и использует результат как имя свойства.

Итак, если вы знаете, что интересующее вас свойство в называется «длина», вы говорите value.length. Если вы хотите извлечь свойство, названное значением, хранящимся в переменной i, вы скажете value[i]. И поскольку имена свойств могут быть любой строкой, если вы хотите получить доступ к свойству с именем “2” или “John Doe”, вы должны использовать квадратные скобки: value[2] or value["John Doe"]. Это возможно, даже если вы знаете точное имя свойства заранее, потому что ни “2” nor “John Doe” не является допустимым именем переменной, и поэтому к нему нельзя получить доступ через точечную нотацию.

В случае массивов

Элементы массива хранятся в свойствах. Поскольку имена этих свойств являются числами, и нам часто нужно получить их имя от переменной, мы должны использовать синтаксис скобки для доступа к ним. Свойство length массива сообщает нам, сколько элементов оно содержит. Это имя свойства является допустимым именем переменной, и мы знаем его имя заранее, поэтому, чтобы найти длину массива, вы обычно пишете array.length, потому что это легче записать, чем array["length"].

163
задан mike 23 March 2009 в 18:58
поделиться

10 ответов

>>> 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')]

Это не в том порядке, в котором вы хотите, но dicts не имеет никакого конкретного порядка в любом случае1. Сортируйте его или упорядочивайте по мере необходимости.

Смотрите: items () , iteritems ()


В Python 3.x вы не использовали бы iteritems (который больше не существует), а вместо этого используйте items , который теперь возвращает «представление» в словарные позиции. См. Документ What's New для Python 3.0 и новую документацию в представлениях .

1: Сохранение порядка вставки для dicts было добавлено в Python 3.7

298
ответ дан Graham 27 August 2018 в 22:22
поделиться
  • 1
    items () возвращает представление dict_keys в python3. Оберните этот вызов с помощью списка в список «список ()». См. Ответ @ SilentGhost – Erich 11 July 2017 в 22:37

Вы хотите использовать методы dict 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
ответ дан Barry Wark 27 August 2018 в 22:22
поделиться

Для использования Python3.x

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

Для Python 2.7 используйте

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

Спасибо

1
ответ дан Dheeraj M Pai 27 August 2018 в 22:22
поделиться

В 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')]
3
ответ дан fragilewindows 27 August 2018 в 22:22
поделиться
  • 1
    Это работало для меня как альтернатива collections.OrderedDict(), которая работает лучше с несколькими версиями Python HTTP Requests lib. Хотя мне не нравится имя функции zip как несколько расплывчатое / перегруженное. – MarkHu 14 June 2016 в 19:53
  • 2
    Обратите внимание, что zip -значение не является «глубоким»; кастинг, то есть если есть вложенные дети, они не будут затронуты. Возможно, вам придется сворачивать собственную рекурсию. – MarkHu 14 January 2017 в 13:48
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list
2
ответ дан Harish 27 August 2018 в 22:22
поделиться
  • 1
    Хотя этот код может помочь решить проблему, он не объясняет why и / или , как он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшит его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, включая те ограничения и допущения. – Toby Speight 23 August 2016 в 10:09
>>> a={ 'a': 1, 'b': 2, 'c': 3 }

>>> [(x,a[x]) for x in a.keys() ]
[('a', 1), ('c', 3), ('b', 2)]

>>> [(a[x],x) for x in a.keys() ]
[(1, 'a'), (3, 'c'), (2, 'b')]
2
ответ дан ismail 27 August 2018 в 22:22
поделиться

Вы можете использовать списки.

[(k,v) for k,v in a.iteritems()] 

даст вам [ ('a', 1), ('b', 2), ('c', 3) ] и

[(v,k) for k,v in a.iteritems()] 

другой пример.

Узнайте больше о представлениях списков , если вам нравится, очень интересно, что вы можете с ними сделать.

14
ответ дан Michael Ohlrogge 27 August 2018 в 22:22
поделиться

Создать список namedtuples

Часто бывает очень удобно использовать namedtuple . Например, у вас есть словарь «имя» в качестве ключей и «оценка» в качестве таких значений, как:

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

Вы можете перечислить элементы как кортежи, отсортированные, если хотите, и получить имя и оценку скажем, игрок с наивысшим результатом (index = 0) очень Pythonically:

>>> player = best[0]

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

Как это сделать:

список в случайном порядке или порядок хранения collections.OrderedDict :

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)
8
ответ дан Remi 27 August 2018 в 22:22
поделиться
[(k,v) for (k,v) in d.iteritems()]

и

[(v,k) for (k,v) in d.iteritems()]
3
ответ дан Robert Rossney 27 August 2018 в 22:22
поделиться
  • 1
    "[(k, v) для (k, v) в d.iteritems ()]" является ужасным эквивалентом d.items () – Devin Jeanpierre 23 March 2009 в 19:05

, поскольку никто другой не сделал, я добавлю версии 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')]
34
ответ дан SilentGhost 27 August 2018 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: