Python 如何在不使用for循环的情况下检查列表中的元素?

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

如果问题的标题措词不当,表示歉意。我目前正在尝试创建一个函数,它接受从1到n的整数列表,其中n是列表的长度。函数应返回列表中重复的第一个值。副本并不总是相邻的。如果一个或多个整数小于1或不是列表,则函数应返回-1。如果没有重复项,则返回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
            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循环检查列表。非常感谢您的帮助

编辑:不允许我使用以下任何内容,但接受任何其他内容

  • for循环
  • min()/max()
  • 枚举()/zip()
  • 排序()
  • 负索引,例如ls[-1]
  • 列表切片

  • 问题是,当找到重复的时,您正在中断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]