Почему в фрагменте кода отображается «TypeError: объект int не подписывается», а в основном блоке кода нет? - PullRequest
0 голосов
/ 11 января 2020

Я пытался выучить вложенные списки в Python, вопрос был в том, чтобы найти человека со вторым по величине баллом, читающего 3 ввода, т. Е. Нет. записей, имя студента и балл студента.

Мой код работает нормально, когда я выполняю следующее:

ns = []
for _ in range(int(input())):
   name = input()
   score = float(input())
   ns += [[name, score]]

sc = sorted(set([x[1] for x in ns]))

for name in sorted(x[0] for x in ns if x[1] == sc[1]):
   print(name)  

Но когда я пытаюсь выполнить фрагмент этого кода:

ns = [21,21,13,24,45,6]
sc = sorted(set([x[1] for x in ns]))
print(sc)

это дает мне ошибку:

 sc = sorted(set([x[1] for x in ns]))
TypeError: 'int' object is not subscriptable

Это потому, что список во фрагменте состоит из целых чисел? Если так, как реализовать это и почему он работает в первом коде?

1 Ответ

1 голос
/ 11 января 2020

x в [x[1] for x in ns] является int и не подлежит подписке. Вместо этого вы можете написать [x for x in ns], который не выдает ошибку. Обратите внимание, что ns здесь это просто список, а не список списков.

Однако в первом фрагменте кода, который вы написали, ns, как определено в ns += [[name, score]], на самом деле является списком списка. и, таким образом, вы можете использовать вложенные подписки, скажем ns[[1]].

. Чтобы отсортировать список из [score, name] s, просто наберите sorted на ns (где ns - это список списков, например, ):

ns = [[21, 'tom'], [21, 'john'], [13, 'ali'], [24, 'sarah']]
sorted(ns)

, который будет сортировать вложенный список на основе оценки и имени в следующем порядке:

# [[13, 'ali'], [21, 'john'], [21, 'tom'], [24, 'sarah']]
...