Подтвердить что ты не робот

Доступ к элементам словаря Python по индексу

Считайте что-то вроде

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

Как мне получить доступ, например, к конкретному элементу этого словаря? например, я хотел бы напечатать первый элемент после некоторого форматирования первого элемента Apple, который в нашем случае является только "американским"?

Дополнительная информация Приведенная выше структура данных была создана путем анализа входного файла в функции python. Однако после создания он остается тем же для этого запуска.

Я использую эту структуру данных в своей функции.

Таким образом, если файл изменяется, при следующем запуске этого приложения содержимое файла будет другим, и, следовательно, содержимое этой структуры данных будет другим, но формат будет таким же. Итак, вы видите, что я в своей функции не знаю, что первый элемент в Apple - это "американский" или что-то еще, поэтому я не могу напрямую использовать "американский" в качестве ключа.

4b9b3361

Ответ 1

Учитывая, что это словарь, вы получаете к нему доступ, используя ключи. Получив словарь, хранящийся в разделе "Apple", сделайте следующее:

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

И, узнав, сколько из них американцы (16), сделайте так:

>>> mydict["Apple"]["American"]
'16'

Ответ 2

Если есть вопросы, если я знаю, что у меня есть диктат dicts, который содержит "Apple" как плод и "американский" как тип яблока, я бы использовал:

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
          'Grapes':{'Arabian':'25','Indian':'20'} }


print myDict['Apple']['American']

как предложили другие. Если вместо этого возникают вопросы, вы не знаете, существует ли "яблоко" как плод и "американец" как тип "яблока", когда вы читаете произвольный файл в своей диктовке структуры данных dict, вы можете сделать что-то вроде:

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

или еще лучше, поэтому вам не нужно излишне перебирать весь dict dict, если вы знаете, что только у Apple есть тип American:

if 'Apple' in myDict:
    if 'American' in myDict['Apple']:
        print myDict['Apple']['American']

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

http://docs.python.org/dev/library/collections.html#collections.OrderedDict

Ответ 3

Как я заметил ваше описание, вы просто знаете, что ваш синтаксический анализатор даст вам словарь, что его значения также являются словарем:

sampleDict = {
              "key1": {"key10": "value10", "key11": "value11"},
              "key2": {"key20": "value20", "key21": "value21"}
              }

Итак, вам нужно перебирать свой родительский словарь. Если вы хотите распечатать или получить доступ ко всем первым словарным клавишам в списке sampleDict.values(), вы можете использовать что-то вроде этого:

for key, value in sampleDict.items():
    print value.keys()[0]

Если вы хотите просто получить первый ключ первого элемента в sampleDict.values(), это может быть полезно:

print sampleDict.values()[0].keys()[0]

Если вы используете пример, который вы дали в вопросе, я имею в виду:

sampleDict = {
              'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
              'Grapes':{'Arabian':'25','Indian':'20'}
              }

Выход для первого кода:

American
Indian

И вывод для второго кода:

American

Ответ 4

В качестве бонуса я хотел бы предложить своего рода другое решение для вашей проблемы. Похоже, вы имеете дело с вложенными словарями, что обычно утомительно, особенно когда вам нужно проверить наличие внутреннего ключа.

В Pypi есть несколько интересных библиотек, связанных с этим, вот быстрый поиск для вас.

В вашем конкретном случае dict_digger кажется подходящим.

>>> import dict_digger
>>> d = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} 
}

>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None

Ответ 5

Вы можете использовать dict['Apple'].keys()[0], чтобы получить первый ключ в словаре Apple, но нет гарантии, что он будет American. Порядок ключей в словаре может меняться в зависимости от содержимого словаря и порядка добавления ключей.

Ответ 6

Вы не можете полагаться на заказ на словари. Но вы можете попробовать следующее:

dict['Apple'].items()[0][0]

Если вы хотите, чтобы заказ был сохранен, вы можете использовать это: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api

Ответ 7

Я знаю, что это 8 лет, но никто, кажется, на самом деле не читал и не ответил на вопрос.

Вы можете вызвать .values() для dict, чтобы получить список внутренних диктов и получить к ним доступ по индексу.

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }

>>>mylist = mydict.values()
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}

>>>myInnerList1 = mylist[0].values()
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = mylist[1].values()
>>>myInnerList2
['25', '20']

Ответ 8

Простой пример, чтобы понять, как получить доступ к элементам в словаре: -

Создать словарь

d = {'dog' : 'bark', 'cat' : 'meow' } 
print(d.get('cat'))
print(d.get('lion'))
print(d.get('lion', 'Not in the dictionary'))
print(d.get('lion', 'NA'))
print(d.get('dog', 'NA'))

Узнайте больше о словарях Python и узнайте больше здесь...

Ответ 9

Мало кто, несмотря на многочисленные ответы на этот вопрос, указал на то, что словари являются неупорядоченными отображениями, и поэтому (до благословения порядка вставки в Python 3.7) идея "первой" записи в словаре буквально сделала не имеет смысла. И даже к OrderedDict можно получить доступ только по числовому индексу, используя такие уродливые значения, как mydict[mydict.keys()[0]] (только Python 2, поскольку в Python 3 keys() является неприписываемым итератором.)

С 3.7 и далее, а на практике и в 3,6 - новое поведение было введено тогда, но не включено как часть спецификации языка, до 3.7 - итерация по ключам, значениям или элементам dict (и я поверьте, набор также) выдаст наименее недавно вставленные объекты первыми. До сих пор не существует простого способа получить к ним доступ с помощью числового индекса вставки.

Что касается вопроса выбора и "форматирования" элементов, если вы знаете ключ, который хотите получить в словаре, вы обычно используете ключ в качестве нижнего индекса для его получения (my_var = mydict['Apple']).

Если вы действительно хотите иметь возможность индексировать элементы по номеру записи (игнорируя тот факт, что конкретный номер записи будет меняться при выполнении вставок), тогда подходящей структурой, вероятно, будет список из двухэлементных кортежей. Вместо

mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

вы можете использовать:

mylist = [
    ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
    ('Grapes', {'Arabian': '25', 'Indian': '20'}
]

В этом режиме первая запись - mylist[0] в классической форме со списком, а ее значение - ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}). Вы можете перебрать весь список следующим образом:

for (key, value) in mylist:  # unpacks to avoid tuple indexing
    if key == 'Apple':
        if 'American' in value:
            print(value['American'])

но если вы знаете, что ищете ключ "Apple", почему бы вам не использовать вместо этого dict?

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