相同的布尔逻辑在循环中工作但在列表理解中不工作

Same Boolean logic works in loop but not in List Comprehension

我一直在 CodeWarriors 上练习一个问题,我基本上必须做不同的集合,但保留没有被排除的 repeating 元素。
例如:([1,2,2,2,3] 和 [1]) 应该给出 --> [2,2,2,3]

所以我想到了将重复的元素维护在一个列表中并添加到最后。

这是我的列表理解代码:[我删除了我编写的多余调试打印命令]

def array_diff(a, b):
    duplicate = []
    duplicate = [i for i in a if a.count(i)>1 and (i not in b) and (duplicate.count(i) < a.count(i)-1) ]
    a = set(a)
    b = set(b)
    return list(a.difference(b)) + duplicate

对于输入:a = [1,2,2,2,3] ; b = [1]
给出输出:[2, 3, 2, 2, 2]
正确的输出应该是:[2,2,2,3]


但是同样的程序没有列表理解,程序给出了正确的输出:

def array_diff(a, b):
    print(a)
    duplicate = []
    for i in a:
        if a.count(i) >1 and i not in b and duplicate.count(i) < a.count(i) -1 :
            duplicate.append(i)
    a = set(a)
    b = set(b)
    return list(a.difference(b)) + duplicate

对于相同的输入,给出输出:[2, 3, 2, 2]


为什么会这样?

在第一个中,您正在检查列表理解中的 duplicate.count。当您的列表理解 完成 时,它将被分配给 duplicate 变量。在那之前,duplicate 是您之前分配给它的任何内容,它是一个空列表。所以 duplicate.count(i) 总是零。

在第二个版本中,您在进行时追加到 duplicate,因此 duplicate.count(i) 有时会是非零值。