1

我有这个 Python 代码,它一一面对整数列表中的项目(在发布的代码中命名为“seen”)与另一个列表的 .f 字段中的所有项目(在发布的代码中命名为“maxx” )。

在每次迭代中,我都在计算(通过变量)第 j 个项目出现在“maxx”列表中的次数,如果它出现的次数少于 3 次c,我想从列表中取出它。pop()

代码完美运行,但是弹出一个项目会将“已看到”列表中的任何后续项目“拉”回一个位置,因此每次满足 if 条件时,循环都会错过列表的下一个项目。

这是代码:

for indj,j in enumerate(seen):    # every item in the 'seen' list..
    c=0
    for k in maxx:                # ..checks for a matching item in the 'maxx' list
        if j==k.f:
            c=c+1;
    if c<3:                       # if the item appears less than 3 times we pop it
        seen.pop(indj)

我试图添加:

indj=indj-1
j=seen[indj]

if构造结束时,但它没有工作

4

2 回答 2

2

您必须创建一个新列表或使用副本。当您在循环时更改列表时,您会跳过一些项目。我会这样做:

def filter_low(lst, maxk, threshold=3):
    for item in lst:
        c = sum(1 for k in maxx if item==k.f)
        if c >= threshold:
             yield item


new_seen = list(filter_low(seen, maxk, 3))

这与以下内容相同:

new_seen = [item for item in seen 
            if sum(1 for k in maxx if item==k.f) >= 3]

您可以通过执行更改原始列表

seen[:] = [item for item in seen 
           if sum(1 for k in maxx if item==k.f) >= 3]
于 2013-06-18T13:32:47.520 回答
1

修改您正在迭代的列表绝不是一个好主意。您可以遍历副本并修改实际列表

popped = 0
for indj, j in enumerate(seen[:]):  
    s = sum(j == k.f for k in maxx)
    if s < 3:
        seen.pop(indj - popped)
        popped += 1

如果seen列表非常大,这可能效率低下。

于 2013-06-18T13:32:20.803 回答