【问题标题】:Enumerate function枚举函数
【发布时间】:2023-03-30 06:42:01
【问题描述】:

谁能给我解释一下。

所以,我有一个列表 s,其中的数字从 -1 到 1,我想提取列表中某些数字的位置。

例子:

s= [-1, 0.5, 0.2, -0.9]

z = enumerate(s)
y1 = []
for i,j in z:
    if j<=-0.8 and j>=-1:
        k = i
        y1.append(k)

y2 = []
for i,j in z:
    if j<=0.8 and j>=-0.8:
        k = i
        y2.append(k)

我得到y1 = [0, 3]y2 = []

但是如果我定义第二个enumerate:

z1 = enumerate(s)
y1 = []
for i,j in z1:
    if j<=-0.8 and j>=-1:
        k = i
        y1.append(k)

z2 = enumerate(s)
y2 = []
for i,j in z2:
    if j<=0.8 and j>=-0.8:
        k = i
        y2.append(k)

我得到结果y1 = [0, 3]y2 = [1, 2]

为什么我需要第二个enumerate

【问题讨论】:

  • 也许enumerate 很懒?试试z = list(enumerate(s))

标签: python list python-3.x enumerate


【解决方案1】:

enumerate 返回序列的迭代器。一旦遍历,就不能再使用了:

In [1]: l = [1, 2, 3, 4, 5]

In [2]: e = enumerate(l)

In [3]: e
Out[3]: <enumerate at 0x7fad7aea25e8>

In [4]: list(e)
Out[4]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

In [5]: list(e)
Out[5]: []

你可以用一个列表来包装它:

In [6]: e = list(enumerate(l))

In [7]: e
Out[7]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

In [8]: list(e)
Out[8]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

In [9]: list(e)
Out[9]: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

您还可以使用列表推导来简化您的解决方案:

y1 = [i for i, x in enumerate(s) if -1 <= x <= -0.8]
y2 = [i for i, x in enumerate(s) if -0.8 <= x <= 0.8]

【讨论】:

  • @VlS,不客气!不要忘记接受提供的答案之一(帖子分数下方的绿色勾号),以帮助面临同样问题的人。
【解决方案2】:

来自pythondocs,枚举的实现如下:

def enumerate(collection):
    'Generates an indexed series:  (0,coll[0]), (1,coll[1]) ...'     
    i = 0
    it = iter(collection)
    while 1:
        yield (i, it.next())
        i += 1

由于它使用'yield',它是一个生成器,当你在一行中迭代一次时,它会存储状态

for i,j in z

要仅使用一个枚举,请将生成器的值转换为列表并重复使用该列表:

s= [-1, 0.5, 0.2, -0.9]

z = list(enumerate(s))

y1 = []

for i,j in z:
    if j<=-0.8 and j>=-1:
        k = i
        y1.append(k)

y2 = []
for i,j in z:
    if j<=0.8 and j>=-0.8:
        k = i
        y2.append(k)

print(y1)
print(y2)

输出:

[0, 3]
[1, 2]

【讨论】:

    【解决方案3】:

    enumerate 是一个惰性生成器,一旦被调用并遍历它就完成了。所以,我认为最好将它的调用直接包含在for 循环中:

    s= [-1, 0.5, 0.2, -0.9]
    
    y1 = []
    for i,j in enumerate(s):
        if -1 <= j <= -0.8: 
            y1.append(i)
    
    y2 = []
    for i,j in enumerate(s):
        if -0.8 <= j <= 0.8:
            y2.append(i)
    

    附注:

    if j&lt;=-0.8 and j&gt;=-1: 可以替换为if -1 &lt;= j &lt;= -0.8:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2015-03-24
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多