На что указывает индекс[0] в коде?

            geo_logs = [
            {'visit1': ['Москва', 'Россия']},
            {'visit2': ['Дели', 'Индия']},
            {'visit3': ['Владимир', 'Россия']},
            {'visit4': ['Лиссабон', 'Португалия']},
            {'visit5': ['Париж', 'Франция']},
            {'visit6': ['Лиссабон', 'Португалия']},
            {'visit7': ['Тула', 'Россия']},
            {'visit8': ['Тула', 'Россия']},
            {'visit9': ['Курск', 'Россия']},
            {'visit10': ['Архангельск', 'Россия']}
    ]
    visits_russia = []
    for visits in geo_logs:
        if 'Россия' in list(visits.values())[0]:
            visits_russia.append(visits)
    print(visits_russia, '\n')

Код перебирает словарь и возвращает visit если в значении есть 'Россия'.

Но я не понимаю что делает этот [0]. Если этого 0 нет, то не работает ничего, почему нельзя просто проверить на наличие в значении 'Россия' без указания индекса?

Спасибо за помощь!


Ответы (3 шт):

Автор решения: gil9red

Метод values() возвращает список из значений словаря. У вас это будет список из списков, т.к. по каждому ключу словаря в значении будет список

Я бы рекомендовал отдельным циклом пройтись по спискам из values

Пример:

geo_logs = [
    {'visit1': ['Москва', 'Россия']},
    {'visit2': ['Дели', 'Индия']},
    {'visit3': ['Владимир', 'Россия']},
    {'visit4': ['Лиссабон', 'Португалия']},
    {'visit5': ['Париж', 'Франция']},
    {'visit6': ['Лиссабон', 'Португалия']},
    {'visit7': ['Тула', 'Россия']},
    {'visit8': ['Тула', 'Россия']},
    {'visit9': ['Курск', 'Россия']},
    {'visit10': ['Архангельск', 'Россия']}
]

visits_russia = []
for visits in geo_logs:
    for countries in visits.values():
        if 'Россия' in countries:
            visits_russia.append(visits)
print(visits_russia, '\n')
→ Ссылка
Автор решения: Roman Konoval

geo_logs - список словарей.

visits - это конкретный словарь (пример - {'visit1': ['Москва', 'Россия']}).

visits.values() - это список значений из словаря. Для словаря {'visit1': ['Москва', 'Россия']} это будет [['Москва', 'Россия']]. То есть у вас значение в словаре уже список, и values вернет список списков. В общем случае там может быть много элементов, но у вас в словаре только один, потому и тут будет только один элемент - список ['Москва', 'Россия'].

visits.values()[0] - вернет этот элемент, т.е. ['Москва', 'Россия'].

'Россия' in list(visits.values())[0] - проверяет, входит ли Россия в этот список.

Без [0] проверка не работает, так как вы проверяете входит ли 'Россия' в список [['Москва', 'Россия']], что очевидно не так, так как так единственный элемент это список ['Москва', 'Россия'], а он не равен строке 'Россия'.

→ Ссылка
Автор решения: Hazgan 1
a = {'visit1': ['Москва', 'Россия']}
print(list(a.values())[0])
print(list(a.values()))
print(a.values())

Попробуйте ввести данный код и поймете, как это работает) Выведет:

['Москва', 'Россия']
[['Москва', 'Россия']]
dict_values([['Москва', 'Россия']])

Я думаю понятно почему работает 1 вариант... Индекс 0 просто убирает массив в массиве оставляя один массив. Когда Вы вызываете функцию values, создается массив в который добавляется ещë один массив. И если Вы проверяете наличие России в массиве в котором другой массив, то не находите значение Россия. Надеюсь объяснил понятно)

→ Ссылка