Как реорганизовать подсписки и исключить конкретные индексы в этих подсписках?

Как я могу реорганизовать подсписки и исключить некоторые предметы из подписок для создания нового списка подписок?

По реорганизации я имею в виду, что я хочу изменить порядок элементов в каждой подсписке по каждому подсписку. Например, перемещая каждый элемент с индексом 0 в индекс 1 и перемещая каждый элемент индекса 2 в индекс 0 через каждый подсписчик. В то же время я не хочу включать индекс 1 в исходный список подписчиков.

Original_List = [['a','b','c'],['a','b','c'],['a','b','c']]

Desired_List = [['c','a'],['c','a'],['c','a']]

В настоящее время у меня есть эта функция, которая перестраивает и вытягивает разные индексы из подсписок.

def Function(li):
 return map(lambda x: (x[2] + "|" + x[0]).split("|"),li)

Однако бывают ситуации, когда подсписчики намного длиннее, и есть больше индексов, которые я хочу вытащить.

Вместо того, чтобы делать эту же функцию для 3 или 4 индексов, подобных этому, например:

def Function(li):
 return map(lambda x: (x[2] + "|" + x[1] + "|" + x[0]).split("|"),li)

Я бы хотел использовать * args, чтобы я мог указать разные количества индексов подписок для вытаскивания. Это то, что у меня есть до сих пор, но я получаю TypeError.

def Function(self,li,*args):
 return map(lambda x: ([int(arg) + "|" for arg in args]).split("|"))

Я получаю TypeError, который я могу понять, но не могу обойти:

TypeError: string indices must be integers, not str

Возможно, существует лучший и быстрый способ полностью переупорядочить подписи и исключить некоторые элементы внутри этих подписок?

Кроме того, было бы замечательно, если бы функция могла иметь дело с подобластями, подобными этому.

Original_List = [['a','b','c',['1','2','3']],['a','b','c',['1','2','3']],['a','b','c',['1','2','3']]]

Входы, которые я хотел бы достичь:

[2] для c

[0] для

[3] [1] для '2'

Desired_List = [['c','a','2'],['c','a','2'],['c','a','2']]
3 ответа

Я думаю, что вы описываете следующее:

def sublist_indices(lst, *args):
 return [[l[i] for i in args] for l in lst]

>>> sublist_indices([[1, 2, 3], [4, 5, 6]], 2, 0)
[[3, 1], [6, 4]]

Если ваши подсписки и подзаголовки содержат все повторяющиеся элементы (например, строки, списки), вы можете использовать itertools.chain.from_iterable чтобы сгладить под-подсписки, а затем индексировать:

from itertools import chain

def sublists(lst, *args):
 return [[list(chain.from_iterable(l))[i] for i in args] for l in lst]

например

>>> lst = [['a', 'b', 'c', ['1', '2', '3']],
 ['a', 'b', 'c', ['1', '2', '3']],
 ['a', 'b', 'c', ['1', '2', '3']]]
>>> sublists(lst, 2, 0, 4)
[['c', 'a', '2'], ['c', 'a', '2'], ['c', 'a', '2']]


Я не уверен, что именно вы подразумеваете под "реорганизацией", но это вложенное понимание списка займет список списков li и вернет новый список, содержащий списки в li, но с индексом в args исключенных.

def exclude_indices(li, *args):
 return [[subli[i] for i in range(len(subli)) if i not in args] for subli in li]


original = [['a','b','c'],['a','b','c'],['a','b','c']]
desired = [['c','a'],['c','a'],['c','a']]

def filter_indices(xs, indices):
 return [[x[i] for i in indices if i < len(x)] for x in xs]

filter_indices(original, [2, 0])
# [['c', 'a'], ['c', 'a'], ['c', 'a']]
filter_indices(original, [2, 1, 0])
# [['c', 'b', 'a'], ['c', 'b', 'a'], ['c', 'b', 'a']]

licensed under cc by-sa 3.0 with attribution.