Python 如何在不使用for循环的情况下检查列表中的元素?
如果问题的标题措词不当,表示歉意。我目前正在尝试创建一个函数,它接受从1到n的整数列表,其中n是列表的长度。函数应返回列表中重复的第一个值。副本并不总是相邻的。如果一个或多个整数小于1或不是列表,则函数应返回-1。如果没有重复项,则返回0 这是我当前的代码:Python 如何在不使用for循环的情况下检查列表中的元素?,python,list,Python,List,如果问题的标题措词不当,表示歉意。我目前正在尝试创建一个函数,它接受从1到n的整数列表,其中n是列表的长度。函数应返回列表中重复的第一个值。副本并不总是相邻的。如果一个或多个整数小于1或不是列表,则函数应返回-1。如果没有重复项,则返回0 这是我当前的代码: def find_duplicates(ls): if type(ls) != list: return -1 non_dupe = [] i = 0 while i < len(ls
def find_duplicates(ls):
if type(ls) != list:
return -1
non_dupe = []
i = 0
while i < len(ls):
if ls[i] < 1:
return -1
break
if ls.count(i) > 1:
return i
break
else:
non_dupe.append(i)
i += 1
if len(non_dupe) == len(ls):
return 0
因为它返回2而不是预期的-1。我对Python比较陌生,似乎无法修复此错误。我已尝试寻找解决此问题的方法,但不允许我使用for循环检查列表。非常感谢您的帮助
编辑:不允许我使用以下任何内容,但接受任何其他内容
问题是,当找到重复的时,您正在中断while循环。在这种情况下,函数首先查找复制的 试试这个:
def find_duplicates(ls):
if type(ls) is not list:
return -1
duplicated = 0
i = 0
while i < len(ls):
if ls[i] < 1:
return -1
if ls.count(ls[i]) > 1 and duplicated == 0
duplicated = ls[i]
i += 1
return duplicated
def find_duplicates(ls):
if type(ls) != list:
return -1
non_dupe = []
i = 0
while i < len(ls):
if ls[i] < 1:
return -1
elif ls[i] in non_dupe:
return ls[i]
else:
non_dupe.append(i)
i += 1
return 0
def查找重复项(ls):
如果类型(ls)未列出:
返回-1
重复=0
i=0
而我1且重复==0
重复=ls[i]
i+=1
重复返回
您的测试用例返回2,因为与0
相比,2
停留在较低的索引
我建议在继续之前对列表进行排序:
def查找重复项(ls):
如果类型(ls)!=名单:
返回-1
sorted_list=ls.sorted()#将排序后的'ls'分配给另一个变量,同时保持'ls'的顺序不变
非重复=[]
i=0
而我1:
返回i
打破
其他:
非重复追加(i)
i+=1
如果len(非重复)=len(ls):
返回0
我推荐的另一种方法是使用
set
——Python的内置数据类型。也许当所有的测试用例通过时,你应该考虑以后尝试这个方法。查看本教程,了解设置
用法:。您的代码过早地返回了一个副本;遍历列表时,函数首先发现2
为重复项,返回它,然后立即停止函数。但它没有看到最后的0
因此,您需要让函数看到列表的最后部分,寻找一个负数。如果在此过程中发现负数,则可以停止该函数。如果直到结束时才看到负数,则让它返回重复值:
def查找重复项(ls):
如果不存在(ls,列表):#检查ls是否为列表
返回-1
dup=0
已看到=[]#到目前为止已看到的数字列表
i=0#指数
而我
你们非常接近。试试这个:
def find_duplicates(ls):
if type(ls) != list:
return -1
non_dupe = []
i = 0
while i < len(ls):
if ls[i] < 1:
return -1
elif ls[i] in non_dupe:
return ls[i]
else:
non_dupe.append(i)
i += 1
return 0
def查找重复项(ls):
如果类型(ls)!=名单:
返回-1
非重复=[]
i=0
而我
我希望这能解决您的问题检查类型关键字
是否使用。所以,如果类型(ls)不是列表:
只是为了澄清,您不允许使用for
,但允许在时使用?@Goion噢,谢谢您让我知道。我来修理that@j1-李:是的,我不允许使用for循环,但我可以使用while。我会编辑我的帖子,让它更清楚我能用什么,不能用什么。当你的while循环在find_duplicates([1,2,2,0])中找到重复的2时,它就会中断。
这里只需要一个注释break
。不管怎样,当您从函数返回时,不需要is。您是对的。。。我没有删除它。我已经更新了。。。再查一遍。如果没有重复项,则返回0。在重新排列顺序时,对列表进行排序将找不到第一个重复项。顺序需要保持不变,以确定哪个元素首先被复制。我的错,我错过了那一点。非常感谢你提醒我!
my_list = [1,2,2,0]
result = list(set(filter(lambda x: my_list.count(x) > 1 , my_list)))
# Result => [2]