Два наиболее распространенных способа доступа к свойствам в 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"]
.
>>> 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
Вы хотите использовать методы 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')]
>>>
Для использования 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)
Спасибо
В 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
14 June 2016 в 19:53
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
>>> 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')]
Вы можете использовать списки.
[(k,v) for k,v in a.iteritems()]
даст вам [ ('a', 1), ('b', 2), ('c', 3) ]
и
[(v,k) for k,v in a.iteritems()]
другой пример.
Узнайте больше о представлениях списков , если вам нравится, очень интересно, что вы можете с ними сделать.
Создать список 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)
[(k,v) for (k,v) in d.iteritems()]
и
[(v,k) for (k,v) in d.iteritems()]
, поскольку никто другой не сделал, я добавлю версии 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')]