#python #list-comprehension
#python #понимание списка
Вопрос:
Я пытаюсь выполнить понимание списка с помощью чтения из аргументов CL
weights = [[int(arg) for arg in sys.argv[i]] for i in range(3,7)]
Это то, чего я достиг, но результат представляет собой многомерный массив, подобный:
[[3], [4], [5], [6]]
Что я пытаюсь получить с помощью одной строки понимания списка, так это:
[3, 4, 5, 6]
Комментарии:
1. удалить
[ ]
…?2. @Joonyoung Нет, вам нужно будет перевернуть циклы
Ответ №1:
Я думаю, вы слишком усложняете это. Если вы хотите, чтобы аргументы командной строки 3-6 были целыми числами, сделайте это:
weights = [int(arg) for arg in sys.argv[3:7]]
Обратите внимание, что если отсутствуют аргументы, это не приведет IndexError
к появлению подобных вашим. Если вам нужно такое поведение, попробуйте сделать это вместо этого:
weights = [int(sys.argv[i]) for i in range(3, 7)]
И если вы хотите еще лучший синтаксический анализ CL arg, ознакомьтесь с argparse .
Имейте в виду, что элементы sys.argv
являются строками, и если вы выполняете итерацию по строке, как в c for c in sys.argv[3]
, вы получаете символы * , что означает, что если вы задали 2-значный вес в командной строке, например 14
, он будет разделен на его цифры, 1
и 4
. Если это то, что вы действительно хотите, сделайте это:
weights = [int(c) for i in range(3, 7) for c in sys.argv[i]]
* Технически строки длиной 1
Ответ №2:
Вы можете использовать enumerate . Перечисление работает следующим образом:
a = ['a','b','c']
for i in enumerate(a):
print(i)
#outputs
(0, 'a')
(1, 'b')
(2, 'c')
#This is the solution
[int(arg) for index,arg in enumerate(sys.argv) if index in range(3,7)]