Python单行代码判断列表重复元素的替代实现方案咨询
问题
我已经编写了一个判断列表是否存在重复元素的函数:
def duplica(list_to_check): if len(set(list_to_check)) != len(list_to_check): print('there are duplicates inside the list') result = 0 else: result = 1 return result
测试代码print(duplica([1, 1, 2]))的输出为“there are duplicates inside the list”和0。现在想咨询是否存在使用单行代码(例如lambda或map)实现该功能的替代方式?
回答
当然有啦!你的核心思路(利用集合去重后对比长度)本身就很巧妙,我们可以把它改写成更简洁的单行实现,甚至能完美保留原函数的打印提示+返回值逻辑。下面给你几种实用的方案:
方案1:贴合原函数逻辑的单行lambda
如果想保留打印提示,同时返回0/1的结果,可以借助Python的短路特性实现:
duplica = lambda lst: (print('there are duplicates inside the list') or 0) if len(set(lst)) != len(lst) else 1
测试效果和原函数完全一致:
print(duplica([1,1,2])) # 输出:there are duplicates inside the list \n 0 print(duplica([1,2,3])) # 输出:1
这里print函数返回None,所以print(...) or 0会最终返回0,刚好匹配原函数的返回逻辑。
方案2:极简布尔值返回版
如果不需要打印提示,只是判断是否存在重复,还能更精简:
has_duplicates = lambda lst: len(set(lst)) != len(lst)
要是想把布尔值转换成0/1,套个int()就行:
duplica = lambda lst: int(len(set(lst)) == len(lst))
这个版本返回1代表无重复,0代表有重复,和原函数逻辑对齐。
另外还有一种更高效的写法(大列表场景下找到第一个重复就停止,不用全转集合):
has_duplicates = lambda lst: any(lst[i] in lst[:i] for i in range(1, len(lst)))
方案3:用map实现(仅作思路参考)
用map实现的话逻辑会绕一点,而且效率偏低(因为会多次遍历列表),但也能达成需求:
duplica = lambda lst: 0 if any(map(lambda x: lst.count(x) > 1, lst)) else 1
这种方法不推荐在大列表上使用,仅作为拓展思路参考。
内容的提问来源于stack exchange,提问作者max scender
相关产品推荐
相关产品推荐

