我在程序中操作大列表,那么知道列表是否填充相同数字的最快方法是什么?我无法使用模块。
例如:
>>> 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
答案 0 :(得分:4)
此处:all(x==lst[0] for x in lst)
。 (x==lst[0] for x in lst)
是generator comprehension。如果迭代器的所有元素(生成器理解是迭代器)传递给all()
,bool()
返回True
,它将值转换为布尔值( True
或True
)。请注意,在发现其他元素后,它会立即评估为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)