Вложенный список - создать новый вложенный список с индексами в качестве элементов - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы создать новый вложенный список из уже существующего вложенного списка.Этот новый список должен включать индексы + 1 из существующего списка.

Пример:

my_list = [[20, 45, 80],[56, 29],[76],[38,156,11,387]]

Результат:

my_new_list = [[1,2,3],[1,2],[1],[1,2,3,4]]

Как я могу создать такой список?

Ответы [ 5 ]

0 голосов
/ 10 октября 2018

Вот несколько простых решений:

>>> lst = [[20, 45, 80],[56, 29],[76],[38,156,11,387]]   
>>> out = [[x+1 for x,_ in enumerate(y)] for y in lst]
>>> out
[[1, 2, 3], [1, 2], [1], [1, 2, 3, 4]]
>>>
>>>
>>> out = [[x+1 for x in range(len(y))] for y in lst]
>>> out
[[1, 2, 3], [1, 2], [1], [1, 2, 3, 4]]
0 голосов
/ 10 октября 2018

Другое решение может быть:

new_list = [list(range(1,len(item)+1)) for item in my_list]
0 голосов
/ 10 октября 2018

Использование понимания вложенного списка

Сначала вы хотите получить список с каждым числом от 1 до длины вашего подсписка.Есть несколько способов сделать это с помощью списка .

Например

[i for i in range(1, len(sublist) + 1)]

или

[i + 1 for i in range(len(sublist))]

Второй, который вы хотите сделать этодля каждого подсписка внутри вашего my_list.Поэтому вы должны использовать понимание вложенного списка:

>>> my_list = [[20, 45, 80],[56, 29],[76],[38,156,11,387]]
>>> my_new_list = [[i+1 for i in range(len(sublist))] for sublist in my_list]
>>> my_new_list
[[1, 2, 3], [1, 2], [1], [1, 2, 3, 4]]

Использование понимания списка с диапазоном

Другим способом было бы использование встроенной функции range в качестве генератора дляВаши подсписки:

>>> [list(range(1, len(sublist) + 1)) for sublist in my_list]
[[1, 2, 3], [1, 2], [1], [1, 2, 3, 4]]

Использование карты с диапазоном

Или вы можете использовать встроенную функцию map

>>> list(map(
...     lambda sublist: list(range(1, len(sublist) + 1)),
...     my_list
... ))
[[1, 2, 3], [1, 2], [1], [1, 2, 3, 4]]
0 голосов
/ 10 октября 2018

сохранить цикл Python, принудительно выполнить итерацию range (требуется для Python 3) в понимании списка, так что это быстрее, чем классическое понимание с двойным вложением:

my_list = [[20, 45, 80],[56, 29],[76],[38,156,11,387]]

index_list = [list(range(1,len(x)+1)) for x in my_list]
0 голосов
/ 10 октября 2018

Есть несколько способов сделать это, но первое, что приходит на ум, - перечислить элементы с начальным индексом 1 в понимании вложенного списка.

>>> [[index for index, value in enumerate(sub, 1)] for sub in my_list]
[[1, 2, 3], [1, 2], [1], [1, 2, 3, 4]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...