首页 > 解决方案 > 相同的布尔逻辑在循环中有效,但在列表理解中无效

问题描述

我一直在练习 CodeWarriors 上的一个问题,我基本上必须做不同的集合,但保留没有被排除 的重复元素。
例如: ([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]


为什么会这样?

标签: pythonpython-3.xlist-comprehensionboolean-logic

解决方案


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

在第二个版本中,您正在追加duplicate,所以duplicate.count(i)有时会是非零的。


推荐阅读