在Python中,我遇到一个奇怪的错误,a = [x[1], x[2]]
可以在其中工作,而a = x[1:]
却不能。
>>> out
farray([Y[0], Y[1], Y[2]])
>>> out[1]
Y[1]
>>> remaining_out = [out[1], out[2]]
>>> remaining_out[0]
Y[1]
>>> remaining_out = out[1:]
>>> remaining_out[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/kmshah4/.local/lib/python3.6/site-packages/pyeda/boolalg/bfarray.py", line 485, in __getitem__
nsls = self._norm_slices(fsls) File "/home/kmshah4/.local/lib/python3.6/site-packages/pyeda/boolalg/bfarray.py", line 890, in _norm_slices nsls.append(_norm_index(i, fsl, *self.shape[i]))
File "/home/kmshah4/.local/lib/python3.6/site-packages/pyeda/boolalg/bfarray.py", line 1127, in _norm_index
raise IndexError(fstr.format(dim, start, stop))
IndexError: expected dim 0 index in range [1, 3)
请帮助。
答案 0 :(得分:0)
Python中的对象不仅仅因为它们支持索引就自动支持切片符号。必须对此进行编程。语法可能比您正在使用的语法更方便。
如果它是可迭代的,则可以先转换为列表,然后将其切成薄片,例如
a = [*x][1:]
对于特别大的可迭代对象(这里似乎不是这种情况),这可能效率不高。在这种情况下,请islice
之前将其解压缩到列表中。
from itertools import islice
a = [*islice(x, 1, None)]
但是对象并不仅仅因为它们支持索引而自动支持迭代。在这种情况下,您仍然可以使用range()
和理解力手动进行迭代,
a = [x[i] for i in range(1, len(x))]
尽管直到您还有其他一些要处理的内容时,这实际上并没有那么短。如果您非常需要这种模式,可以将其抽象为一个函数。
最后,对象不一定仅支持len
,因为它们支持索引。如果您事先不知道长度,那么您所能做的就是遍历并抓住LookupError
。