Рассмотрим такой диктат
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
Как мне получить доступ, например, к определенному элементу этого словаря? например, я хотел бы напечатать первый элемент после некоторого форматирования первого элемента Apple, который в нашем случае является только «американским»?
Дополнительная информация Приведенная выше структура данных была создана путем синтаксического анализа входного файла в функции python. Однако после создания он остается таким же для этого прогона.
Я использую эту структуру данных в своей функции.
Таким образом, если файл изменится, при следующем запуске этого приложения содержимое файла будет другим, и, следовательно, содержимое этой структуры данных будет другим, но формат будет таким же. Итак, вы видите, что в своей функции я не знаю, что первый элемент в Apple - это «американский» или что-то еще, поэтому я не могу напрямую использовать «американский» в качестве ключа.
источник
dict
. Слово «dict» уже является ключевым словом в Python. Используйте что-нибудь еще, напримерmydict
.Ответы:
Поскольку это словарь, доступ к нему осуществляется с помощью клавиш. Получив словарь, хранящийся в папке «Яблоко», выполните следующие действия:
А узнав, сколько их американцев (16), сделайте так:
источник
.keys()
чтобы иметь к ним доступ динамически."n"
с неизвестной глубиной, сохраненный в неизвестном элементе.Если есть вопросы, если я знаю, что у меня есть диктант, который содержит «яблоко» как фрукт и «американское» как тип яблока, я бы использовал:
как предлагали другие. Если вместо этого возникает вопрос, вы не знаете, существует ли «Apple» как фрукт и «American» как тип «Apple», когда вы читаете произвольный файл в свою структуру данных dict of dict, вы можете сделать что-то вроде:
или еще лучше, чтобы не перебирать без необходимости весь dict of dicts, если вы знаете, что только Apple имеет тип American:
Во всех этих случаях не имеет значения, в каком порядке словари фактически хранят записи. Если вас действительно беспокоит порядок, вы можете подумать об использовании
OrderedDict
:http://docs.python.org/dev/library/collections.html#collections.OrderedDict
источник
Как я заметил ваше описание, вы просто знаете, что ваш парсер предоставит вам словарь, значения которого тоже являются словарями, например:
Итак, вам нужно перебирать родительский словарь. Если вы хотите распечатать или получить доступ ко всем первым ключам словаря в
sampleDict.values()
списке, вы можете использовать что-то вроде этого:Если вы хотите просто получить доступ к первому ключу первого элемента в
sampleDict.values()
, это может быть полезно:Если вы используете пример, который вы привели в вопросе, я имею в виду:
Выход для первого кода:
И вывод для второго кода:
источник
В качестве бонуса я хотел бы предложить другое решение вашей проблемы. Кажется, вы имеете дело с вложенными словарями, что обычно утомительно, особенно когда вам нужно проверить наличие внутреннего ключа.
На pypi есть несколько интересных библиотек по этому поводу, вот вам быстрый поиск .
В вашем конкретном случае подходит dict_digger .
источник
Вы можете использовать
dict['Apple'].keys()[0]
для получения первого ключа вApple
словаре, но нет гарантии, что это будетAmerican
. Порядок ключей в словаре может меняться в зависимости от содержимого словаря и порядка добавления ключей.источник
OrderedDict
вcollections
библиотекеЯ знаю, что ему 8 лет, но, похоже, никто на самом деле не прочитал и не ответил на вопрос.
Вы можете вызвать .values () в dict, чтобы получить список внутренних dicts и, таким образом, получить к ним доступ по индексу.
источник
'dict_values' object does not support indexing
. Угадайте этот ответ нуждается в обновлении , так как вам нужно обернуть dict_values восстановить списокВ словарях нельзя полагаться на порядок. Но вы можете попробовать это:
Если вы хотите сохранить порядок, вы можете использовать это: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api
источник
Простой пример, чтобы понять, как получить доступ к элементам в словаре: -
Создать словарь
Узнайте больше о словарях Python и узнайте в интерактивном режиме здесь ...
источник
Кажется, мало кто, несмотря на множество ответов на этот вопрос, указывал, что словари являются неупорядоченными отображениями, и поэтому (до благословения порядка вставки в Python 3.7) идея «первой» записи в словаре буквально сделала не имеет смысла. И даже
OrderedDict
доступ к an можно получить только по числовому индексу, используя такие уродливые формы, какmydict[mydict.keys()[0]]
(только для Python 2, поскольку в Python 3keys()
итератор без подписок).Начиная с версии 3.7 и на практике в версии 3,6 - тогда было введено новое поведение, но не было включено как часть спецификации языка до версии 3.7 - итерация по ключам, значениям или элементам словаря (и, я полагаю, set also) сначала будет возвращать наименее недавно вставленные объекты. До сих пор нет простого способа получить к ним доступ по числовому индексу вставки.
Что касается вопроса о выборе и «форматировании» элементов, если вы знаете ключ, который хотите получить в словаре, вы обычно используете этот ключ в качестве подстрочного индекса для его получения (
my_var = mydict['Apple']
).Если вы действительно хотите иметь возможность индексировать элементы по номеру записи (игнорируя тот факт, что номер конкретной записи будет меняться по мере выполнения вставок), то подходящей структурой, вероятно, будет список двухэлементных кортежей. Вместо того
вы можете использовать:
В этом режиме первая запись находится
mylist[0]
в классической форме со списком, и ее значение равно('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Вы можете перебирать весь список следующим образом:но если вы знаете, что ищете ключ «Apple», почему бы вам просто не использовать вместо него dict?
Вы можете ввести дополнительный уровень косвенного обращения путем кэширования списка ключей, но сложность сохранения двух структур данных в синхронизации неизбежно усложнит ваш код.
источник
С помощью следующей небольшой функции копаться в словаре в форме дерева становится довольно просто:
Теперь
dig(mydict, "Apple.Mexican")
возвращается10
, а возвращаетdig(mydict, "Grape")
поддерево{'Arabian':'25','Indian':'20'}
. Если ключа нет в словаре,dig
возвращаетсяNone
.Обратите внимание, что вы можете легко изменить (или даже параметризовать) символ-разделитель с '.' в '/', '|' и т.п.
источник