Понимание списка с помощью нескольких циклов for

#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)]