如果列表中的所有项目都不同,我如何定义一个返回False的函数,如果不是

时间:2016-10-24 20:27:32

标签: python for-loop

我试图创建一个检查列表项清晰度的函数,如果没有多个匹配元素,则返回false。

def AllDifferent(s):
    for i in s:
        for i2 in s:
            if i2 == i:
                return False
            else:
                return True

但它似乎不起作用。我做错了什么?

4 个答案:

答案 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)

python中的

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的特殊方式来做事! Python有listset。 Set基本上是一个无序列表,其中同一元素的出现次数不会超过1次。

您可以说将list转换为set可以消除重复。因此,如果我们要检查所有元素是否不同(仅出现一次),我们必须检查强制转换listset不会删除任何元素。这可以通过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)