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

问题描述 投票:0回答:1

我一直在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]

但是同一程序without列表理解,该程序给出正确的输出:

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]


为什么会这样?

python-3.x list-comprehension boolean-logic
1个回答
0
投票

在第一个中,您正在检查列表理解中的duplicate.count。在列表理解完成之前,duplicate是您之前为其分配的任何内容,它是一个空列表。因此duplicate.count(i)始终为零。

在第二个版本中,您将不断添加duplicate,因此duplicate.count(i)有时会为非零。

© www.soinside.com 2019 - 2024. All rights reserved.