在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中使用索引创建一个包含列表子集的新列表的主要内容,如果未能解决你的问题,请参考以下文章