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

Posted

技术标签:

【中文标题】在python中使用索引创建一个包含列表子集的新列表【英文标题】:creating a new list with subset of list using index in python 【发布时间】:2013-10-15 15:32:23 【问题描述】:

列表:

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

我想要一个使用 a[0:2],a[4], a[6:] 的子集的列表,

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

【问题讨论】:

好吧...如果您将示例中的, 更改为+ 以进行列表连接,您将在那里... @JonClements:差不多。我想应该是a[4:5][a[4]]。但你在道德上是对的。 :^) 谢谢乔恩——我就是这么做的,但是遇到了错误; DSM——谢谢,这解决了我的问题 【参考方案1】:

假设

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]

【讨论】:

【参考方案2】:

试试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])。

【讨论】:

感谢第二个解决方案很棒 再次感谢这个函数——参数中 * 的用途是什么? 使用它(我相信它被称为 splat 运算符),因此您可以为函数提供任意数量的参数。看到这个:***.com/questions/3394835/args-and-kwargs @user2783615 没问题(尽管我建议您注意该解决方案,因为它对于列表列表失败)。【参考方案3】:

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

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

【讨论】:

以上是关于在python中使用索引创建一个包含列表子集的新列表的主要内容,如果未能解决你的问题,请参考以下文章

Python - 从包含值列表的字典中添加具有映射值的新列

包含 Pandas 的新列中包含列表的值计数 [重复]

Python如何创建一个衡量与城市接近程度的新列?

为多索引 Panda 数据框创建基于另一列的新列

Python Pandas 索引错误:列表索引超出范围

创建一个包含grepped字符串的新列