如何知道Python 3中的列表是否填充了相同的数字?

时间:2013-11-17 13:22:46

标签: python list fill

我在程序中操作大列表,那么知道列表是否填充相同数字的最快方法是什么?我无法使用模块。

例如:

>>> isFilled([1,1,1,1,1])
True
>>> isFilled([5,5,5,5])
True
>>> isFilled([1,6,5,1,1])
False

我已经这样做了,但它创建了一个新的列表,这是一个问题,因为我操纵大清单:

def isFilled(lst):
    return [lst[0]]*len(lst) in lst

7 个答案:

答案 0 :(得分:4)

此处:all(x==lst[0] for x in lst)(x==lst[0] for x in lst)generator comprehension。如果迭代器的所有元素(生成器理解是迭代器)传递给all()bool()返回True,它将值转换为布尔值( TrueTrue)。请注意,在发现其他元素后,它会立即评估为False

答案 1 :(得分:2)

列表是空的(在这种情况下所有元素都是相同的)或者我们应该将所有元素与第一个元素进行比较,直到一个元素不同。 all()就是这么做的。

def isFilled(lst):
    if not lst:  # Empty
        return True
    return all(element == lst[0] for element in lst)

答案 2 :(得分:1)

简单的一行

def isFilled(myList):
    return len(set(myList)) == 1

或者

def isFilled(myList):
    first = myList[0]
    return not any(first != item for item in myList)

答案 3 :(得分:1)

您可以使用list.count

>>> def isFilled(lis):
    return bool(lis) and lis.count(lis[0]) == len(lis)
... 
>>> isFilled([1,1,1,1,1])
True
>>> isFilled([1,6,5,1,1])
False
>>> isFilled([])
False

答案 4 :(得分:1)

你可能会过度思考这个问题。简单的for循环怎么样:

def isFilled(lst):
    try:
        n = lst[0]
    except IndexError:
        return True        # I'm assuming that an empty list is considered filled
    for i in lst:
        if i != n:
            return False
    return True

或者,为简洁起见,可读性效率我认为not lst or all(i == lst[0] for i in lst)是最好的。 not lst确保将空列表视为已填充,如果列表为空,则不会引发IndexError。如果未将空列表视为已填充,则需要bool(lst) and all(i == lst[0] for i in lst)

这两者都具有O(n)时间复杂度。 for循环具有O(1)空间复杂度,all具有O(1)(如果all实现良好)。

答案 5 :(得分:1)

使用len

len(set(myList)) <= 1

all函数和一点LC:

all(v != l[i-1] for i,v in enumerate(l) if i)

答案 6 :(得分:1)

更通用的版本可以在所有迭代(不仅仅是列表)上运行:

def all_equal(iterable):
    i = iter(iterable)
    fst = next(i, object())
    return all(el == fst for el in i)

如果不应将空迭代视为完全相同,那么:

i = iter(a)
empty = object()
fst = next(i, empty)
return fst is not empty and all(el == fst for el in i)