我知道这将返回原始数组s.t,它没有前导零,但是我不明白这里的语法是如何实现的。
result = [0,0,1,4,2,0,3]
result = result[next((i for i, x in enumerate(result) if x != 0),
len(result)):] or [0]
答案 0 :(得分:4)
让我们分解一下:
result = result[
next(
(i for i, x in enumerate(result) if x != 0),
len(result)
):
] or [0]
Python next()
函数使用第一个参数作为迭代器,第二个参数作为默认参数。当迭代器为“空”时使用默认值。因此,如果i for i, x....
行不产生任何结果,则结果将是result[len(result):]
或只是一个空字符串。在这种情况下,or [0]
部分会采取行动,并向您返回一个元素列表[0]
。
现在转到迭代器行。它说
i for i, x in enumerate(result) if x != 0
,用英语表示找到i
的所有索引result
,使得result[i] != 0
。并将其放入next()
,这意味着您将采用此类索引中的第一个。因此,在输入列表中,您将提取第一个不为零的元素的 index 。然后,使用与上一段相同的逻辑,构建result[i:]
,这意味着从第一个非零元素中提取result
的子列表。
答案 1 :(得分:0)
result = [0,0,1,4,2,0,3]
a = (i for i, x in enumerate(result) if x != 0)
print(a) # <generator object <genexpr> at 0x110e075e8>
b = next(a, len(result))
print(b) # 2
c = result[b:]
print(c) # [1, 4, 2, 0, 3]
result = c or [0]
print(result) # [1, 4, 2, 0, 3]
答案 2 :(得分:0)
width
产生类似于
的迭代enumerate(result)
[(0, 0), (1, 0), (2, 1), (3, 4), (4, 2), (5, 0), (6, 3)]
说的是第一个和第二个索引,请返回第一个。因此,我们现在有了一个0-6的列表。
i for i, x
将此列表作为迭代器,如果该迭代器不产生任何结果,则由于next()
语句而返回[0]
。
基本上,您是将第一个元素替换为or
(不执行任何操作),然后复制列表的其余部分。
答案 3 :(得分:0)
无论如何,@ adrtam和其他人已经很好地解释了这一切。对于那些使用(丑陋的)代码进行解释的人来说,它看起来像这样:
result = [0,0,1,4,2,0,3]
i=0 # initialize the position counter
for x in result: # scan each element in the list...
if x != 0: # ...checking for non-zero elements...
break # ... break the loop if we find it...
else:
i+=1 # ... otherwise increase the counter
# i is now the index of the first non-zero element in the list
result = result[i:] # take a slice of the list, starting with the i-th element
# Note that, if i=len(result), then the slice will be an
# empty array []. That would happen, for example, if all
# the elements in the array were 0 (since we are checking
# against 0
# Hence the protection:
# If we ended up here with an empty list, assign a list with a single 0 instead
if not result:
result = [0]
print(result)
查看实际操作