相同的布尔逻辑在循环中工作但在列表理解中不工作
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)
有时会是非零值。
我一直在 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)
有时会是非零值。