Python 当列表理解不起作用时,标准循环起作用

Python 当列表理解不起作用时,标准循环起作用,python,list,output,list-comprehension,Python,List,Output,List Comprehension,为什么下面的代码在我使用列表理解的地方不起作用,但常用的方法却起作用 exams = [1,2,3,1,2,3,4,1,5,1] repeatedExams = [] # EXCPECTED OUPUT # repeatedExams = [1,2,3] # IF I USE repeatedExams.append(i) repeatedExams = [repeatedExams.append(i) for i in exams if (exams.count(i)>1) and

为什么下面的代码在我使用列表理解的地方不起作用,但常用的方法却起作用

exams = [1,2,3,1,2,3,4,1,5,1]
repeatedExams = []

# EXCPECTED OUPUT
# repeatedExams = [1,2,3]

# IF I USE repeatedExams.append(i)
repeatedExams = [repeatedExams.append(i) for i in exams if (exams.count(i)>1) and (i not in repeatedExams)]
    # OUTPUT 
    # repeatedExams = [None,None,None]

# IF I ONLY USE i
repeatedExams = [i for i in exams if (exams.count(i)>1) and (i not in repeatedExams)]
    # OUTPUT
    # repeatedExams = [1,2,3,1,2,3,4,1,5,1]

# WORK 
for i in exams:
    if exams.count(i) > 1 and i not in repeatedExams:
        repeatedExams.append(i)

    # OUTPUT
    # repeatedExams = [1,2,3]
list.append()
返回无

理解为您返回一个集合;您不需要预先定义一个

当您正在构建一个时,您不应该使用它,因此理解中的
不在repeatedExams
不会做您想做的事情


如果要计算重复次数,请使用计数器

from collections import Counter

exams = [1,2,3,1,2,3,4,1,5,1]
c = Counter(exams)
repeatedExams = [k for k,v in c.items() if v > 1]

如果您真的想进行列表理解,则需要将循环分为两个步骤:

#仅保留重复的元素
repeatedExams=[i为i,如果考试。计数(i)>1]
#删除重复元素的重复项
repeatedExams=设置(repeatedExams)

列表理解语法告诉Python获取一个iterable,并为该iterable的每个元素计算一个表达式,然后用该表达式返回的所有结果构建一个列表
append
是一种被称为“就地”操作符的操作。这意味着它不是通过返回结果来操作的,而是通过修改关联的对象来操作的。就地运算符的实际值通常为
None
。例如,
repeatedExams.append(i)
修改对象
repeatedExams
repeatedExams
的修改版本现在存储在原始
repeatedExams
所在的位置,并且
repeatedExams.append(i)
返回
None
。然后,您的语法将所有这些
None
s存储在一个列表中

这可能是有益的

for i in exams:
    if (exams.count(i)>1) and (i not in repeatedExams):
        print(repeatedExams.append(i))
看看你能得到什么。

试试这个-

repeatedExams = [i for i in exams if exams.count(i)>1] 
repeatedExams = set(repeatedExams)
或-


列表理解
为您添加一个新列表
;这就是他们的全部目的
append
不返回任何内容,因此您的第一种方法无效。这是否回答了您的问题<代码>列表(设置([x代表x,如果考试的话。计数(x)>1]))感谢@usuario12339314对我的需求,它工作得很好。使用
设置来避免第二次列表理解。@user12339314将删除重复项,而不是计算重复项。这个答案有二次运行时间,顺便说一下:)我只是将所有内容插入列表理解中。
。。。因为如果我不在repeatedExams中,我在repeatedExams中是不是很昂贵?这对你有帮助吗?
repeatedExams = set([i for i in exams if exams.count(i)>1])