如何重新组织子列表并排除这些子列表中的特定索引?

时间:2014-01-26 20:38:09

标签: python list function map sublist

如何重新组织子列表并从子列表中排除某些项目以创建新的子列表列表?

通过重新组织,我的意思是我想要更改每个子列表中每个子列表中项目的顺序。例如,将索引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 个答案:

答案 0 :(得分:1)

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']]

答案 1 :(得分:1)

我认为你所描述的是:

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]

e.g。

>>> 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']]

答案 2 :(得分:1)

我不确定“重新组织”究竟是什么意思,但这个嵌套列表理解将包含列表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]