Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中查看列表中是否有重复的元素_Python_List - Fatal编程技术网

如何在Python中查看列表中是否有重复的元素

如何在Python中查看列表中是否有重复的元素,python,list,Python,List,你好,我只是想知道我的代码有什么问题 这是《思考Python》一书中的一个问题,该书要求编写一个函数来返回True,如果列表中有重复的元素,则返回False def has_duplicates(t): for i in t: if i in t.pop(t.index(i)): return True return False 怎么了 您可以在迭代时从t中删除元素。这会阻止迭代按预期工作,通常效果是跳过元素。不要这样做 t.pop(t

你好,我只是想知道我的代码有什么问题

这是《思考Python》一书中的一个问题,该书要求编写一个函数来返回True,如果列表中有重复的元素,则返回False

def has_duplicates(t):
    for i in t:
        if i in t.pop(t.index(i)):
            return True
    return False
怎么了

  • 您可以在迭代时从
    t
    中删除元素。这会阻止迭代按预期工作,通常效果是跳过元素。不要这样做

  • t.pop(t.index(i))
    返回
    i
    (或与其相等的值),因此无论您希望通过
    实现什么,如果我在
    ,我认为您都无法实现


您可以通过比较列表的长度和从该列表创建的集合的长度来测试它,因为集合会删除重复项

def has_duplicates(t):
    return len(t) > len(set(t))

好吧,通过列表理解(感谢Steve Jessop):

结果:

>>> 
True
>>> 

首先,在对列表进行迭代时,决不篡改列表。。 其次,您的代码正在检查i==您正在弹出的项目。这永远都是正确的,因为当你弹出一个项目时,python会将该项目返回给你。所以,把它和我比较是没有用的,因为你刚刚把我放了。这就像比较,如果i==i。。 尝试t=['1','2','3']的函数,并使用调试器验证我所说的

由于无法使用集合,因此可以执行以下操作:

def has_duplicates(t):
    #first have a backup to keep the iteration clean
    t_backup = t.copy()
    for i in t_backup:
        #first pop the item
        t.pop(t.index(i))
        #then check if such item still exists
        if i in t:
            return True
    return False


在列表上循环时从不修改列表的可能副本!是的,但是那里的答案使用set。我的任务是不使用set。所以,使用index!或者列表的副本,不是吗?@Clodion你的意思是我应该在循环开始时创建一个列表,排除“I”,并检查“I”是否在该列表中?这不是答案,这是一个注释。请删除它并发表评论。@webzy“你好,我只是想知道我的代码中有什么错误。”我会说这是一个答案。我在这里的观点是,尽管标题问题实际上是“我正在做的练习的解决方案是什么?”,但这并不限制我为提问者解决练习。我正在考虑是否解决该练习(对于性能,这分为三种情况:内容可散列,内容不可比较但不可散列,内容仅可平等比较),但这取决于提问者如何回答:-)这正好告诉我“我的代码出了什么问题”谢谢Steve Jessop,但您问题的标题是:“如何查看Python中列表中是否有重复的元素”;-)由于发问者被限制不使用
set
(出于某些原因,在评论之前会保留该选项),因此为了好玩,让我们假设列表中的元素不可散列。例如,也许它们也是列表:-)@Amit Talmor哈哈!这不是关于胜利,而是关于帮助;-)@webzy-至少我没有忘记在len(集合(t).;-)后面加上一个右括号为什么要从集合中列出一个列表?我想他是想赢得一些东西,所以他打字太快,而且有一个打字错误;-)@那么他们应该少打一些:
returnlen(t)>len(set(t))
。你完全正确。我甚至对我的答案做了一些修改,使它更。。。short:-)对于输入
[2,2]
,它返回
False
,因为
范围(len(t))
应该是
t
<如果其他内容为False,则代码>为True可以简化为
bool(something)
,尽管在这种情况下
something
已经是布尔值,所以只需
something
。此外,通过执行
any(t.count(i)>1表示i在t中)
可以获得短路的一些好处。是的,当然!我看你的评论!谢谢通过输入
[]
,您可以防止
any
短路,因为现在需要在调用
any
之前构建整个真/假值列表。是的!再次感谢!
>>> 
True
>>> 
def has_duplicates(t):
    #first have a backup to keep the iteration clean
    t_backup = t.copy()
    for i in t_backup:
        #first pop the item
        t.pop(t.index(i))
        #then check if such item still exists
        if i in t:
            return True
    return False