Перейти к содержимому

Как обратиться к словарю в списке python

  • автор:

Обращение к элементу списка (вложенному в словарь) не зная индекс

Но как быть, если индекс списка заранее неизвестен (может меняться), но есть только известная пара «Surname»:»surname5″ , которая не меняется? Т.е. чтобы искомый словарь можно было найти по «surname5» вне зависимости от того, под каким индексом он может оказаться и получить значение из «Age».

Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
задан 13 апр 2018 в 18:44
Olaf Gusterson Olaf Gusterson
37 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Чтобы найти в списке example[‘list’] словарь, содержащий ‘Surname’ ключ со значением ‘surname5’ и достать из этого словаря значение ‘Age’ ключа в Питоне:

result = next(d['Age'] for d in example['list'] if d.get('Surname') == 'surname5') 

В командной строчке, можно jq использовать:

$ jq -r '.list[] | select(.Surname=="surname5") | .Age' input.json 

Отслеживать
ответ дан 14 апр 2018 в 8:25
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков

def func(): for dictionary in example["list"]: if "Surname" in dictionary and dictionary["Surname"] == "surname5": return dictionary # assert func()["Age"] == "age5" 

Отслеживать
ответ дан 13 апр 2018 в 19:00
96 1 1 серебряный знак 4 4 бронзовых знака

Видимо я чего-то не понимаю. «Инструкция assert позволяет производить проверки истинности утверждений, что может быть использовано в отладочных целях.» В данном случае, значение ключа «Age» заранее неизвестно. Задача стоит в том, чтобы либо получить индекс словаря в списке (в примере это индекс 4) и обратиться к его элементу (result = example[«list»][4][«Age»]), либо как-то сделать это минуя получение индекса.

13 апр 2018 в 19:31

В условии: [. чтобы искомый словарь можно было найти по «surname5» вне зависимости от того. ]. Словарь найден. [assert func()[«Age»] == «age5»] — это проверка, как и в условии задачи: result = example[«list»][4][«Age»] print (result) # Результат: age5

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

Словари в Python — это мощный инструмент для хранения информации. Они позволяют хранить пары «ключ-значение» и обеспечивают быстрый доступ к значению по ключу. Однако, иногда возникает необходимость обратиться к произвольному элементу словаря, не зная заранее его ключ.

Пример проблемы

Рассмотрим следующий словарь:

mydict =

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

mydict[list(mydict.keys())[0]]

Здесь mydict.keys() — это специальный объект, который содержит все ключи словаря. Функция list() преобразует этот объект в список, а индекс [0] дает доступ к первому элементу этого списка, то есть к первому ключу словаря. Далее этот ключ используется для доступа к значению в словаре.

Улучшенное решение

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

next(iter(mydict))

Функция iter() преобразует словарь в итератор, который представляет собой объект, по которому можно «пройтись» последовательно, то есть получить доступ к каждому его элементу по очереди. Функция next() возвращает следующий элемент итератора. Если итератор только что создан, то next() возвращает первый элемент.

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

Этот способ более эффективен, потому что он не требует преобразования всего словаря в список, что может быть затратно по времени и памяти, если словарь большой.

Циклы в Python

При написании программ часто возникает потребность делать одно и то же действие для нескольких объектов. Например, сохранить 5 пользователей:

user1.save() user2.save() user3.save() user4.save() user5.save() 

Кода пока не очень много, но что будет, когда пользователей будет 20? А что если нужно обработать 3 миллиона пользователей вашего сайта? Помогут циклы.

Цикл по списку

Цикл — это запуск одного и того же кода для каждого элемента в списке. Вот как выглядит пример выше с использованием списка и циклов:

users = [user1, user2, user3, user4, user5] for user in users: user.save() 

Каждый элемент списка users по очереди подставится в переменную user и для него запустится код с отступом.

Что, всё ещё копипастить пользователей в список? Нет, чаще всего такое не требуется и код выглядит так:

users = get_users_from_database() # возвращает список всех пользователей for user in users: user.do_something() # работа с каждым пользователем по очереди user.save() 

Снова, каждый пользователь по очереди попадёт в переменную user , у него вызовется метод .do_something() , а затем метод .save() .

Цикл по словарю

Словарь очень легко можно превратить в 2 списка:

capitals =  "Russia": "Moscow", "England": "London", "China": "Beijing", "Italy": "Rome" > 

Первый список — ключи словаря (первые элементы в парах):

print(capitals.keys()) # ['Russia', 'England', 'China', 'Italy'] 

Второй список — значения (вторые элементы в парах):

print(capitals.values()) # ['Moscow', 'London', 'Beijing', 'Rome'] 

По умолчанию, если передать в for словарь, он начнёт перебирать ключи:

for country in capitals: print(country) # Russia # England # China # Italy 

Но так же через ключи словаря можно добраться и до значений:

for country in capitals: capital = capitals[country] print("столица <> это <>".format(country,capital)) # столица Russia это Moscow # столица England это London # столица China это Beijing # столица Italy это Rome 

В Python есть ещё один способ добраться до значений словаря, использовать .items() . Этот метод превращает словарь в список кортежей:

print(capitals) # # "Russia": "Moscow", # "England": "London", # "China": "Beijing", # "Italy": "Rome" # > print(capitals.items()) # [ # ('Russia', 'Moscow'), # ('England', 'London'), # ('China', 'Beijing'), # ('Italy', 'Rome') # ] 

И теперь цикл сможет итерироваться сразу по двум переменным:

for country, capital in capitals.items(): print("столица <> это <>".format(country, capital)) # столица Russia это Moscow # столица England это London # столица China это Beijing # столица Italy это Rome 

Выполнить код несколько раз

Что, если нужно выполнить код заранее известное количество раз? например, сгенерировать 10 случайных чисел и вывести на экран? По какому такому списку мне перебиать элементы?

В таком случаевыручает функция range() .

Что она делает проще показать на примерах:

  • range(5) — вернёт список из 5 элементов, начинаяс нуля: [0, 1, 2, 3, 4]
  • range(2,10) — вернёт список из элементов от 2 до 10: [2, 3, 4, 5, 6, 7, 8, 9]
  • range(2,10,3) — вернёт список из каждого третьего элемента от 2 до 10: [2, 5, 8]

Теперь, научившись генерировать списки нужной длины, можно сгенерировать 10 случайных чисел:

import random for number in range(10): print(random.randint(1,100)) 

В терминал выведется 10 случайных чисел от 1 до 100. Работает так же, как и ранее: range(10) — это список с числами от 0 до 9. Они по очереди подставятся в переменную number , но ни на что не повлияют, т.к. в коде «внутри for » переменная number не используется.

Строка — тоже “список”

Python запросто переводит одни типы данных в другие. Он может притвориться, что строка — это список из её символов:

text = "Девман" for letter in text: print(letter) # Д # е # в # м # а # н 

Можно превратить строку в список более явно с помощью функции list() :

text = "Девман" my_list = list(text) print(my_list) # ['Д', 'е', 'в', 'м', 'а', 'н'] 

Что дальше

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Словарь в списке. Последний элемент словаря в списке

Удалить последний элемент в односвязном списке
приведите пример удаления последнего элементы в односвязном списке в интернете находил вот это .

Как удалить последний элемент в списке?
Создал односвязный линейный список.Как написать функцию для удаления последнего элемента? .

В двунаправленном списке удалить последний четный элемент
В двунаправленном списке удалить последний четный элемент. Написал удаление для первого четного.

Поменять местами первый и последний элемент в списке
Не могу понять, как создать процедуру для этого. Поможете пожалуйста с программой? Здесь часть.

В односвязном списке поменять местами 3 и последний элемент
Есть у кого пример как в односвязном списке поменять местами 3 и последний элемент ?

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

1 2 3 4
>>> namelis=[{'name': 'Bart'}, {'name': 'Lisa'}, {'name': 'Maggie'}, {'name': 'Homer'}, {'name': 'Marge'}] >>> namelis[-1]['name'] 'Marge' >>>

Регистрация: 16.12.2016
Сообщений: 149
Garry Galler, Спасибо. А если нужно вывести все элементы , кроме последнего? Через цикл

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от m4ksc0r Посмотреть сообщение

все элементы , кроме последнего

1 2 3
>>> namelis[:-1] [{'name': 'Bart'}, {'name': 'Lisa'}, {'name': 'Maggie'}, {'name': 'Homer'}] >>>

И цикл тут не нужен.
Регистрация: 16.12.2016
Сообщений: 149
Garry Galler, а чтобы без ключей выводило?

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено m4ksc0r как решение

Решение

1 2 3
>>> print(*[d['name'] for d in namelis[:-1]]) Bart Lisa Maggie Homer >>>

Регистрация: 16.12.2016
Сообщений: 149

ЦитатаСообщение от Garry Galler Посмотреть сообщение

print(*[d[‘name’] for d in namelis[:-1]])
это генератор?

Эксперт Python

5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от m4ksc0r Посмотреть сообщение

это генератор?
Нет. Это list comprehension — выражение создающие список.
Генератор создается круглыми скобками:

print(*(d['name'] for d in namelis[:-1]))

Если его сохранить в переменной,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
>>> g = (d['name'] for d in namelis[:-1]) то можно узнать что это такое >>> g generator object genexpr> at 0x0203EF90> >>> У него можно запрашивать элементы методом next >>> next(g) 'Bart' >>> next(g) 'Lisa' >>> next(g) 'Maggie' >>> next(g) 'Homer' >>> next(g) Traceback (most recent call last): File "", line 1, in module> next(g) StopIteration >>> Или в цикле - так удобнее. >>> g=(d['name'] for d in namelis[:-1]) >>> for name in g: print(name) Bart Lisa Maggie Homer >>>

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

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

Определить функцию, переставляющую в списке первый и последний элемент
Знакомлюсь с функциями на Python Интересно посмотреть на решение таких элементарных задачек, чтобы.

Найти в одном списке максимальный элемент, а в другом списке соответствующий ему по индексу
Здравствуйте! Помогите решить задачу — есть два cписка a = и b = . Необходимо найти из списка ‘a’.

Как поменять местами первый и последний элемент в односвязном списке?
Есть 2 класса: public class Node < private Node link; private int info; public.

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

В непустом динамическом списке последний элемент переместить в начало списка
Добрый день! Помогите пожалуйста. Ниже код,который был дан как образец в методичке и был переделан.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *