Python и нет очевидного способа получить определенный элемент из словаря - PullRequest
1 голос
/ 15 июля 2011

Почему я могу легко сделать цикл for в Python, чтобы пройтись по всем элементам словаря в том порядке, в котором я добавил элементы, но нет очевидного способа получить доступ к определенному элементу?Когда я говорю элемент, я говорю о паре ключ + значение.

Я просмотрел то, что некоторые базовые учебники по Python говорят о словарях, но ни один не отвечает на мой вопрос, я не могу найти свойОтветьте также на docs.python.org.

Согласно: доступ к определенным элементам из словаря Python (комментарий Senderies) дикт должен быть неупорядоченным, но тогда почему вывод цикла forих в том порядке, в котором я их положил?

Ответы [ 5 ]

7 голосов
/ 15 июля 2011

Вы получаете доступ к определенному элементу в словаре по ключу. Это словарь . Если это поведение не то, что вам нужно, используйте что-то другое, кроме словаря.

диктат должен быть неупорядоченным, но тогда почему цикл for печатает их в порядке, в котором я их поместил?

Совпадение: в основном, вы случайно поместили их в том порядке, который предпочитает Python. Это не так сложно сделать, особенно с целыми числами (int s являются их собственными хешами и будут иметь тенденцию выходить из разряда в возрастающем числовом порядке, хотя это подробности реализации CPython и может не соответствовать действительности в других реализациях Python), особенно если вы начнете вводить их в числовом порядке.

«Неупорядоченный» действительно означает, что вы не контролируете заказ, и он может измениться из-за различных критериев, связанных с реализацией, поэтому вам не следует полагаться на него. Конечно, когда вы перебираете словарь, элементы появляются в некотором порядке.

Если вам нужен доступ к элементам словаря по числовому индексу, существует множество способов сделать это. collections.OrderedDict является стандартным способом; ключи всегда возвращаются в том порядке, в котором вы их добавили, поэтому вы всегда можете набрать foo[foo.keys()[i]] для доступа к i элементу. Есть и другие схемы, которые вы могли бы использовать.

5 голосов
/ 15 июля 2011

Доступ к Python-диктам осуществляется путем хеширования ключа.Так что, если у вас есть какой-то значительный диктант, и все идет в том порядке, в котором вы их поставили, тогда самое время начать делать ставки на лотерею!

my_dict = {}
my_dict['a'] = 1
my_dict['b'] = 2
my_dict['c'] = 3
my_dict['d'] = 4

for k,v in my_dict.items():
    print k, v

доходность:

a 1
c 3
b 2
d 4
0 голосов
/ 15 июля 2011

Результат хеширования нескольких значений варьируется в зависимости от значений:

иногда порядок, кажется, сохраняется: следующий пример с d_one

, порядок:не соблюдается: следующий пример с d_two

Вера в то, что ордер в любом случае соблюдается, объясняется только тем, что вас обманывают особые случаи, когда ордер явно сохраняется

d_one = {}

for i,x in enumerate((122,'xo','roto',885)):
    print x
    d_one[x] = i

print
for k in d_one:
    print k

print '\n=======================\n'

d_two = {}

for i,x in enumerate((122,'xo','roto','taratata',885)):
    print x
    d_two[x] = i

print
for k in d_two:
    print k

result

122
xo
roto
885

122
xo
roto
885

=======================

122
xo
roto
taratata
885

122
taratata
xo
roto
885

Кстати, то, что вы называете "элементами словаря", обычно называют "элементами словаря" (отсюда методы items () и iteritems () словаря)

0 голосов
/ 15 июля 2011

Если вы хотите перебрать элементы в порядке вставки, вы должны использовать OrderedDict . Обычный дикт не гарантирует того же самого, поэтому вы позже напрашиваетесь на неприятности, если полагаетесь на это.

Если вы хотите получить доступ к определенному элементу, вы должны получить к нему доступ по его ключу, используя оператор [] или метод get(). В конце концов, это основная функция диктата.

0 голосов
/ 15 июля 2011
d = {}
d['first'] = 1
d['second'] = 2
d['third'] = 3
print d
# prints {'seconds': 2, 'third': 3, 'first': 1}
# Hmm, just like the docs say, order of insertion isn't preserved.

print d['third']
# prints 3
# And there you have it: access to a specific element
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...