Если у меня есть кортеж кортежей:

cyc = (('a-b', 'b-a'), ('a-c', 'c-a'), ('b-c', 'c-b'))

И словарь словарей:

data = {'a-b': {'x': 1, 'y': 2},
        'b-a': {'x': 3, 'y': 4},
        'a-c': {'x': 5, 'y': 6},
        'c-a': {'x': 7, 'y': 8},
        'b-c': {'x': 9, 'y': 10},
        'c-b': {'x': 11, 'y': 12}}

Как получить доступ к элементам словаря, используя элементы кортежа?

Например, если я просто хочу напечатать элемент:

print(data[cyc[1[0['x']]]])

Я учил, что это вернется 5.

Вместо этого это дает мне сообщение об ошибке:

'' TypeError: 'int' объект не может быть подписан ''

0
user11655340 6 Июл 2019 в 02:37

3 ответа

Лучший ответ

Когда вы получаете доступ к вложенным элементам, вы не вкладываете индексы, вы добавляете их.

cyc[1] == ('a-c', 'c-a')

Это значит

cyc[1][0] == 'a-c'

Чтобы использовать это в качестве индекса в словаре, вы пишете

data[cyc[1][0]]

И затем, чтобы получить индекс x из этого вложенного словаря, вы добавляете ['x']:

data[cyc[1][0]]['x']

Когда вы пишете что-то вроде 0['x'], это означает индексировать значение 0, что не имеет никакого смысла.

3
Barmar 5 Июл 2019 в 23:48

Вот последовательность подвыражений, которые вы надеялись пройти:

>>> cyc[1]
('a-c', 'c-a')
>>> cyc[1][0]
'a-c'
>>> data[cyc[1][0]]
{'x': 5, 'y': 5}
>>> data[cyc[1][0]]['x']
5
2
J_H 5 Июл 2019 в 23:46

Внутри [] вы помещаете ключ, к которому осуществляется доступ. Если вы хотите, чтобы изнутри этого возвращаемого значения был элемент, вы помещаете еще один [] после , который:

print(data[cyc[1][0]]['x'])

Извлекает из словаря data значение в ключе cyc[1][0], который является элементом 0 внутри элемента 1 внутри cyc. Из этого значения, которое является другим словарем, возьмите значение в ключе 'x'

2
Luiz Ferraz 5 Июл 2019 в 23:45