Python 如何以不规则的间隔分割列表?
我在下面的列表中列出了我想要做的切片,这样我的最终结果就是[1,1.5,2,2.5,4.5,5]。我试图通过索引访问,但它给了我错误Python 如何以不规则的间隔分割列表?,python,numpy,Python,Numpy,我在下面的列表中列出了我想要做的切片,这样我的最终结果就是[1,1.5,2,2.5,4.5,5]。我试图通过索引访问,但它给了我错误 `list = [1,1.5,2,2.5,3,3.5,4,4.5,5] print(list) print(list[0,1,2,3,7,8])` 不能使用索引列表对列表进行切片或索引。您必须使用一个循环,例如,通过,或一个包含隐式循环的函数,如: 但是你可以用numpy数组做类似的事情。您不能直接使用这六个索引(因为这意味着多维索引),但可以使用包含这六个索
`list = [1,1.5,2,2.5,3,3.5,4,4.5,5]
print(list)
print(list[0,1,2,3,7,8])`
不能使用索引列表对列表进行切片或索引。您必须使用一个循环,例如,通过,或一个包含隐式循环的函数,如:
但是你可以用numpy数组做类似的事情。您不能直接使用这六个索引(因为这意味着多维索引),但可以使用包含这六个索引的任何数组,如列表:
>>> arr = np.array(lst)
>>> print(arr[[0, 1, 2, 3, 7, 8]])
[1. 1.5 2. 2.5 4.5 5. ]
这在基本索引教程中进行了解释。Python不支持不规则间隔。您必须使用列表
lst = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
indices = (0, 1, 2, 3, 7, 8)
slice = [lst[i] for i in indices]
print(slice) # [1, 1.5, 2, 2.5, 4.5, 5]
另外,不要为变量使用
list
等名称,因为这会掩盖内置函数;不要选择非连续范围,而是删除不需要的连续范围。您只想获得原始的列表
减去索引4-6(包括),因此复制列表
,然后删除不需要的索引:
mylist = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
trimmed = mylist[:]
del trimmed[4:7]
print(trimmed)
或者,您可以使用操作符.itemgetter
检索您列出的特定索引,例如:
from operator import itemgetter
mylist = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
print(itemgetter(0, 1, 2, 3, 7, 8)(mylist))
多个值的
itemgetter
将输出一个元组
,因此如果这让您感到困扰,您必须转换回列表
,例如打印(列表(itemgetter(0,1,2,3,7,8)(mylist))
(请注意,选择将变量名更改为mylist
可以访问list
构造函数,如果将变量命名为list
,则无法访问该构造函数).您已经标记了这个NumPy,但是您没有使用任何NumPy数据结构或功能。NumPy
是如何涉及的?您在这里使用的是普通的Pythonlist
s(顺便说一句,命名变量list
是一个糟糕的主意,因为您这样命名list
构造函数)。首先,我尝试了这个numpy数组而不是列表。这就是为什么我标记numpy数组,arr[[0,1,2,3,7,8]]
。请注意带有列表的[].Index。尽管由于numpy索引处理中的一些原因,使用任意数组类对数组进行索引可能会非常奇怪。a[[1,2]]
被视为a[array([1,2])
,但是a[[1,2],[3,4]]]
被视为a[array([1,2]),array([3,4])]
而不是a[array([[1,2],[3,4]])
@user2357112,这是因为元组不是一个类似于索引数组的数组。这在教程部分的第一句中已经提到,后面还有一句“我会解释”链接到同一章的结尾。这不是关于向后兼容性;这是因为元组已经用于多维索引,因此也将它们用于索引数组索引是不明确的。不,你考虑的是不同的效果。我不是在谈论使用元组或其他ArrayLike索引之间的区别;这是文档化。我说的是如果index
是一个列表,a[index]
有时被视为a[array(index)]
有时被视为a[tuple(index)]
@user2357112哦,我明白了,是的,多维度列表的顶层有时被视为一个元组,而文档只是说(某处)你永远不应该依赖它,除非你说你也不能依赖它不会发生(正如你所希望的那样)。
from operator import itemgetter
mylist = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]
print(itemgetter(0, 1, 2, 3, 7, 8)(mylist))