无法理解以下pythonic代码段

时间:2019-05-01 22:58:48

标签: python

我知道这将返回原始数组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]

4 个答案:

答案 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)

在此处https://eval.in/1101785

查看实际操作