使用python中的索引创建包含list子集的新列表

时间:2013-10-08 15:44:00

标签: python list indexing subset

清单:

a = ['a', 'b', 'c', 3, 4, 'd', 6, 7, 8]

我想要一个使用a[0:2],a[4], a[6:]

的子集的列表

我想要一个列表['a', 'b', 4, 6, 7, 8]

3 个答案:

答案 0 :(得分:23)

假设

a = ['a', 'b', 'c', 3, 4, 'd', 6, 7, 8]

并且索引列表存储在

b= [0, 1, 2, 4, 6, 7, 8]

然后一个简单的单行解决方案

c = [a[i] for i in b]

答案 1 :(得分:17)

尝试new_list = a[0:2] + [a[4]] + a[6:]

或更一般地说,这样的事情:

from itertools import chain
new_list = list(chain(a[0:2], [a[4]], a[6:]))

这也适用于其他序列,并且可能更快。

或者你可以这样做:

def chain_elements_or_slices(*elements_or_slices):
    new_list = []
    for i in elements_or_slices:
        if isinstance(i, list):
            new_list.extend(i)
        else:
            new_list.append(i)
    return new_list

new_list = chain_elements_or_slices(a[0:2], a[4], a[6:])

但要注意,如果列表中的某些元素本身就是列表,这会导致问题。 要解决此问题,请使用以前的解决方案之一,或将a[4]替换为a[4:5](或更常见地a[n]替换为a[n:n+1]

答案 2 :(得分:1)

以下定义可能比提出的第一个解决方案更有效

def new_list_from_intervals(original_list, *intervals):
    n = sum(j - i for i, j in intervals)
    new_list = [None] * n
    index = 0
    for i, j in intervals :
        for k in range(i, j) :
            new_list[index] = original_list[k]
            index += 1

    return new_list

然后你可以像下面那样使用它

new_list = new_list_from_intervals(original_list, (0,2), (4,5), (6, len(original_list)))