提问人:Matteo 提问时间:9/16/2023 最后编辑:wjandreaMatteo 更新时间:9/17/2023 访问量:84
为什么我不能在条件表达式中放置切片,我能做什么?
Why can't I put a slice in a conditional expression, and what can I do instead?
问:
我需要以这种方式从列表和索引号中获取一系列列表:[1,2,3,4,5,6]
2
[1,2]
[2]
[]
[3]
[3,4]
[3,4,5]
[3,4,5,6]
我发现这对循环有效
lst = [1,2,3,4,5,6]
index = 2
for i in range(len(lst)+1):
print(lst[(i if i<index else index):(index if i<index else i)])
但这种简化形式并非如此
lst = [1,2,3,4,5,6]
index = 2
for i in range(len(lst)+1):
print(lst[(i:index) if i<index else (index:i)])
你知道为什么它不起作用吗,是否有办法让它起作用,或者有其他方法可以达到相同的结果?
答:
2赞
wjandrea
9/17/2023
#1
如果您阅读切片的语法,proper_slice中的冒号 () 只是一个语法元素,而不是运算符或类似的东西。因此,它不能用于其他表达式(即本例中的条件表达式)。:
相反,我建议移动条件表达式并使用解包,如下所示:
start, end = (i, index) if i < index else (index, i)
print(lst[start:end])
另一种选择是保持相同的结构并使用 slice
,这会创建一个与 slicing 语法等效的对象:
print(lst[slice(i, index) if i < index else slice(index, i)])
同样,您可以在此处使用解包以避免重复名称:slice
print(lst[slice(*(i, index) if i < index else (index, i))])
0赞
Janilson
9/17/2023
#2
原因是这是不允许在任何地方使用的特殊语法。如果你试图写一行,你也会得到一个错误。a:b
slice_variable = (1:5)
归根结底,语法只是创建切片对象的语法糖。在不允许使用此缩短语法的上下文中,只需将其替换为 。start:end:step
slice(start, end, step)
在你的情况下,这将是:
for i in range(len(lst)+1):
print(lst[slice(i,index) if i<index else slice(index,i)])
0赞
Andrej Kesely
9/17/2023
#3
查看您的代码,您可以这样编写循环(使用):min()/max()
for i in range(len(lst) + 1):
print(lst[min(i, index) : max(i, index)])
指纹:
[1, 2]
[2]
[]
[3]
[3, 4]
[3, 4, 5]
[3, 4, 5, 6]
评论
列表
类型。在示例代码中,这不是一个大问题,但它令人困惑,因此最好使用更具描述性的名称,例如,例如,或至少像 .为什么“example = list(...)”会导致“TypeError: 'list' object is not callable”?list
numbers
lst