我试图创建一个检查列表项清晰度的函数,如果没有多个匹配元素,则返回false。
def AllDifferent(s):
for i in s:
for i2 in s:
if i2 == i:
return False
else:
return True
但它似乎不起作用。我做错了什么?
答案 0 :(得分:6)
您可以使用set
执行此操作。 set
是一个只保留任何对象副本的集合。因此set([1,1,1,1,1,1])
与set([1])
相同。因此,我们只需检查set
的长度(大小)是否与list
def allDifferent(in_list):
return len(set(in_list)) == len(in_list)
请注意,Python中的可变数据类型不可清除,并且不能进入set
。对他们来说,我们需要一个更详细的解决方案。
def allDifferent(in_list):
my_list = in_list[:]
while my_list:
x = my_list.pop()
if x in my_list:
return False
return True
答案 1 :(得分:4)
你的else子句会导致函数在第一次比较后立即结束,无论它是真还是假。
相反,移动"返回True"完全在循环之外的声明。如果循环完成而没有返回False,那么它可以返回True。
答案 2 :(得分:1)
set()
存储唯一值。您可以检查列表的长度以及该列表集的长度。如果它们相同,则所有项目都是唯一的,如果不相同,则存在重复值。例如:
>>> unique_list = [ 1, 2, 3, 4, 5] # unique values
>>> not len(unique_list) == len(set(unique_list)) # not since you need inverse
False
>>> non_unique_list = [ 1, 2, 3, 4, 5, 1] # non unique values
>>> not len(non_unique_list) == len(set(non_unique_list))
True
注意: set()
只能与不可变类型的对象一起使用。
答案 3 :(得分:0)
使用Python的特殊方式来做事! Python有list
和set
。 Set基本上是一个无序列表,其中同一元素的出现次数不会超过1次。
您可以说将list
转换为set
可以消除重复。因此,如果我们要检查所有元素是否不同(仅出现一次),我们必须检查强制转换list
到set
不会删除任何元素。这可以通过len
函数来实现。让我们看看它是如何工作的:
def isDistinct(arr):
return True if len(set(arr)) == len(arr) else False
如果列表和不同列表的(集合)长度相等,则返回True
。否则,我们返回false。
当然,len(set(arr)) == len(arr)
是一个布尔表达式,因此您可以省略if
子句:
def isDistinct(arr):
return len(set(arr)) == len(arr)