如何在Python中查看列表中是否有重复的元素
你好,我只是想知道我的代码有什么问题 这是《思考Python》一书中的一个问题,该书要求编写一个函数来返回True,如果列表中有重复的元素,则返回False如何在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
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