首页 > 解决方案 > 保留一个索引,以记录 if 语句在列表理解中传递了多少次

问题描述

我想要一个带有 1 和 0 的向量来检查向量中的元素是否为 1。如果它是 1,我想将此元素标记为 2,下一个等于 3 等等。这很容易通过 for 循环完成.

x=np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])

def label(vector):
U=np.copy(vector)
l=2
for i in range(len(U[:])):
    if occupied(U[i]):
        U[i]=l
        l+=1
return U

接着

label(x)

返回

数组([2., 0., 0., 3., 0., 0., 4., 0., 5., 0.])

然而,由于数组变得更大并最终成为矩阵,我认为使用列表推导是一个好主意。

def count_clusters(vector):
U=np.copy(vector)
label=2
U[:] = [label, label+=1 if el==1. else el for el in U[:]]
return U

应该看起来像这样。问题当然是在列表理解中同时执行 label+=1 以更改数组中元素的值。然后将 label+1 用于以下标签。

所以我想知道这是否可能,或者我应该坚持使用 for 循环。

标签: pythonif-statementlist-comprehension

解决方案


您可以使用迭代器执行相同操作并使用next()

import numpy as np

U = np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
c = iter(range(2, len(U)+2))

result = [float(next(c)) if x == 1 else x for x in U]
# [2.0, 0.0, 0.0, 3.0, 0.0, 0.0, 4.0, 0.0, 5.0, 0.0]

这也是另一种使用方式itertools.count

import numpy as np
from itertools import count

U = np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
c = count(2)

result = [float(next(c)) if x == 1 else x for x in U]
# [2.0, 0.0, 0.0, 3.0, 0.0, 0.0, 4.0, 0.0, 5.0, 0.0]

推荐阅读