Вопрос о доступе к индексам во вложенных списках - PullRequest
0 голосов
/ 20 июня 2019

Я изучал глубокое обучение в Kaggle с помощью упражнения, и это смутило меня.Для того, чтобы написать код для проверки того, был ли что-то хот-дог или нет, был список предсказаний, причем каждый элемент являлся наиболее вероятным предсказанием того, каким было другое изображение.Таким образом, общий список был:

[
    [('n07697537', 'hotdog', 0.8770528)], 
    [('n07697537', 'hotdog', 0.9659182)], 
    [('n07579787', 'plate', 0.7972369)], 
    [('n07583066', 'guacamole', 0.9996675)]
]

И один элемент:

[('n07697537', 'hotdog', 0.9659182)] 

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

Поэтому я попытался получить доступ к метке первого элемента в качестве примера (декодированный - это имя внешнего списка) с помощью print(decoded[0][1]).Это не сработало.Поэтому я проверил пример решения после того, как не смог понять, как правильно получить доступ к элементу, не делая что-то запутанное.Пример кода используется

labels = [d[0][1] for d in decoded]

И это успешно составляет список меток.Я пытался сделать что-то похожее, прежде чем проверять решение, но я был немного не в порядке, я попробовал единственную версию этого, установив d = decoded[0], и я получил список длины 1 с тремя элементами, как пример элемента ранее.Что меня смущает, так это то, что d[0][1] работает, чтобы дать мне ярлык, а decoded[0][1] - нет.Почему?

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Если вы хотите получить доступ к метке первого элемента aka 'hotdog' в первом кортеже, вам нужно print(decoded[0][0][1]), где [1] в decoded[0][0][1] является вторым элементом в кортеже (индексирован 0),правая рука [0] - это сам кортеж, а левая рука [0] - внутренний список.

Некоторый фон: на самом деле в вашем примере есть список, содержащий другие списки кортежей, который показан как [[()],[()],[()]]где () - это кортеж, а [] - это список.Теоретически вы можете иметь несколько кортежей в каждом внутреннем списке, например [[(),(),()],[(),()],[()]] и т. Д. Однако вы получаете доступ к значениям в кортежах так же, как и со списками, используя индексы, поэтому возникает путаница.

Код [d[0][1] for d in decoded] работает, потому что d на самом деле является просто списком кортежей (хотя в этом случае в списке только один кортеж).

0 голосов
/ 20 июня 2019

Вам нужно работать над кортежами:

decoded = [[('n07697537', 'hotdog', 0.8770528)], [('n07697537', 'hotdog', 0.9659182)], [('n07579787', 'plate', 0.7972369)], [('n07583066', 'guacamole', 0.9996675)]]
d = [x for y in decoded for x in y]
labels = [d[0][1] for d in decoded]

Этот скрипт дает:

['hotdog', 'hotdog', 'plate', 'guacamole']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...