Kiểm tra xem tất cả các yếu tố trong một danh sách là giống hệt nhau


389

Tôi cần chức năng sau:

Đầu vào : alist

Đầu ra :

  • True nếu tất cả các yếu tố trong danh sách đầu vào đánh giá bằng nhau bằng toán tử đẳng thức chuẩn;
  • False nếu không thì.

Hiệu suất : tất nhiên, tôi không muốn chịu bất kỳ chi phí không cần thiết nào.

Tôi cảm thấy nó là tốt nhất để:

  • lặp qua danh sách
  • so sánh các yếu tố liền kề
  • ANDtất cả các giá trị Boolean kết quả

Nhưng tôi không chắc cách Pythonic nhất để làm điều đó là gì.


Việc thiếu tính năng ngắn mạch chỉ gây tổn hại cho đầu vào dài (trên ~ 50 phần tử) có các phần tử không bằng nhau từ sớm. Nếu điều này xảy ra thường xuyên đủ (mức độ thường xuyên phụ thuộc vào thời gian của các danh sách), thì cần phải đoản mạch. Thuật toán ngắn mạch tốt nhất dường như là @KennyTM checkEqual1. Nó trả tiền, tuy nhiên, một chi phí đáng kể cho việc này:

  • hiệu suất lên tới 20 lần trong danh sách gần giống nhau
  • hiệu suất lên tới 2,5 lần trong danh sách ngắn

Nếu các đầu vào dài với các phần tử không bằng nhau sớm không xảy ra (hoặc hiếm khi xảy ra), thì không cần phải đoản mạch. Sau đó, nhanh nhất là giải pháp @Ivo van der Wijk.


3
Bằng như trong a == bhoặc giống hệt như trong a is b?
kennytm

1
Giải pháp nên xử lý danh sách trống? Nếu vậy, những gì cần được trả lại?
Doug

1
Bằng như trong a == b. Nên xử lý danh sách trống và trả về True.
tối đa

2
Mặc dù tôi biết rằng nó chậm hơn một số khuyến nghị khác, nhưng tôi không ngạc nhiên khi functools.reduce(operator.eq, a)được đề xuất.
dùng2846495

Câu trả lời:


420

Phương pháp chung:

def checkEqual1(iterator):
    iterator = iter(iterator)
    try:
        first = next(iterator)
    except StopIteration:
        return True
    return all(first == rest for rest in iterator)

Lót:

def checkEqual2(iterator):
   return len(set(iterator)) <= 1

Ngoài ra một lớp lót:

def checkEqual3(lst):
   return lst[1:] == lst[:-1]

Sự khác biệt giữa 3 phiên bản là:

  1. Trong checkEqual2nội dung phải được băm.
  2. checkEqual1checkEqual2có thể sử dụng bất kỳ trình lặp nào, nhưng checkEqual3phải lấy một đầu vào tuần tự, thường là các thùng chứa cụ thể như một danh sách hoặc bộ dữ liệu.
  3. checkEqual1 dừng lại ngay khi tìm thấy sự khác biệt
  4. Do checkEqual1chứa nhiều mã Python hơn nên sẽ kém hiệu quả hơn khi nhiều mục bằng nhau lúc ban đầu.
  5. checkEqual2checkEqual3luôn luôn thực hiện các hoạt động sao chép O (N), chúng sẽ mất nhiều thời gian hơn nếu hầu hết đầu vào của bạn sẽ trả về Sai.
  6. Đối với checkEqual2checkEqual3nó khó hơn để thích ứng so sánh từ a == bđến a is b.

timeit kết quả, đối với Python 2.7 và (chỉ s1, s4, s7, s9 sẽ trả về True)

s1 = [1] * 5000
s2 = [1] * 4999 + [2]
s3 = [2] + [1]*4999
s4 = [set([9])] * 5000
s5 = [set([9])] * 4999 + [set([10])]
s6 = [set([10])] + [set([9])] * 4999
s7 = [1,1]
s8 = [1,2]
s9 = []

chúng tôi nhận được

      | checkEqual1 | checkEqual2 | checkEqual3  | checkEqualIvo | checkEqual6502 |
|-----|-------------|-------------|--------------|---------------|----------------|
| s1  | 1.19   msec | 348    usec | 183     usec | 51.6    usec  | 121     usec   |
| s2  | 1.17   msec | 376    usec | 185     usec | 50.9    usec  | 118     usec   |
| s3  | 4.17   usec | 348    usec | 120     usec | 264     usec  | 61.3    usec   |
|     |             |             |              |               |                |
| s4  | 1.73   msec |             | 182     usec | 50.5    usec  | 121     usec   |
| s5  | 1.71   msec |             | 181     usec | 50.6    usec  | 125     usec   |
| s6  | 4.29   usec |             | 122     usec | 423     usec  | 61.1    usec   |
|     |             |             |              |               |                |
| s7  | 3.1    usec | 1.4    usec | 1.24    usec | 0.932   usec  | 1.92    usec   |
| s8  | 4.07   usec | 1.54   usec | 1.28    usec | 0.997   usec  | 1.79    usec   |
| s9  | 5.91   usec | 1.25   usec | 0.749   usec | 0.407   usec  | 0.386   usec   |

Ghi chú:

# http://stackoverflow.com/q/3844948/
def checkEqualIvo(lst):
    return not lst or lst.count(lst[0]) == len(lst)

# http://stackoverflow.com/q/3844931/
def checkEqual6502(lst):
    return not lst or [lst[0]]*len(lst) == lst

1
Cảm ơn bạn, đây là một lời giải thích thực sự hữu ích của các lựa chọn thay thế. Bạn có thể vui lòng kiểm tra lại bảng hiệu suất của mình không - tất cả có tính bằng msec không và các số trong các ô có đúng không?
tối đa

7
@max: Vâng. Lưu ý rằng 1 msec = 1000 usec.
kennytm

1
Đừng quên phân tích sử dụng bộ nhớ cho các mảng rất lớn, một giải pháp gốc giúp tối ưu hóa các cuộc gọi đến obj.__eq__khi nào lhs is rhsvà tối ưu hóa ngoài trật tự để cho phép các danh sách được sắp xếp ngắn mạch nhanh hơn.
Glenn Maynard

3
Ivo van der Wijk có một giải pháp tốt hơn cho các chuỗi nhanh hơn khoảng 5 lần so với thiết lập và O (1) trong bộ nhớ.
aaronasterling

2
Ngoài ra còn có một itertoolscông thức mà tôi đã thêm vào như một câu trả lời. Có thể đáng để ném nó vào ma trận thời gian của bạn :-).
mgilson

298

Một giải pháp nhanh hơn so với sử dụng set () hoạt động trên các chuỗi (không phải lặp) là chỉ cần đếm phần tử đầu tiên. Điều này giả định danh sách này không trống (nhưng đó là chuyện nhỏ để kiểm tra và tự quyết định kết quả sẽ có trong danh sách trống)

x.count(x[0]) == len(x)

một số điểm chuẩn đơn giản:

>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*5000', number=10000)
1.4383411407470703
>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*4999+[2]', number=10000)
1.4765670299530029
>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*5000', number=10000)
0.26274609565734863
>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*4999+[2]', number=10000)
0.25654196739196777

5
OMG, điều này nhanh hơn 6 lần so với giải pháp thiết lập! (280 triệu phần tử / giây so với 45 triệu phần tử / giây trên máy tính xách tay của tôi). Tại sao??? Và có cách nào để sửa đổi nó để nó ngắn mạch (tôi đoán là không ...)
tối đa

2
Tôi đoán list.count có triển khai C được tối ưu hóa cao và độ dài của danh sách được lưu trữ bên trong, vì vậy len () cũng rẻ. Không có cách nào để đếm ngắn mạch () vì bạn sẽ cần phải thực sự kiểm tra tất cả các yếu tố để có được số đếm chính xác.
Ivo van der Wijk

Tôi có thể thay đổi nó thành: x.count(next(x)) == len(x)để nó hoạt động cho bất kỳ container x nào không? Ahh .. nm, chỉ cần thấy rằng .count chỉ có sẵn cho các chuỗi .. Tại sao nó không được triển khai cho các container dựng sẵn khác? Là đếm trong một từ điển vốn ít có ý nghĩa hơn trong danh sách?
tối đa

4
Một iterator có thể không có chiều dài. Ví dụ, nó có thể là vô hạn hoặc chỉ được tạo động. Bạn chỉ có thể tìm thấy độ dài của nó bằng cách chuyển đổi nó thành một danh sách lấy đi hầu hết các lợi thế của trình lặp
Ivo van der Wijk

Xin lỗi, điều tôi muốn nói là tại sao countkhông được triển khai cho các trình lặp, chứ không phải tại sao lenkhông có sẵn cho các trình vòng lặp. Câu trả lời có lẽ chỉ là sự giám sát. Nhưng nó không liên quan đến chúng tôi vì mặc định .count()cho các chuỗi rất chậm (trăn thuần). Lý do giải pháp của bạn rất nhanh là vì nó dựa vào C được triển khai countbởi list. Vì vậy, tôi cho rằng bất cứ điều gì lặp lại xảy ra để thực hiện countphương thức trong C sẽ được hưởng lợi từ cách tiếp cận của bạn.
tối đa

164

Cách đơn giản và thanh lịch nhất như sau:

all(x==myList[0] for x in myList)

(Vâng, điều này thậm chí hoạt động với danh sách trống! Điều này là do đây là một trong số ít trường hợp python có ngữ nghĩa lười biếng.)

Về hiệu suất, điều này sẽ thất bại trong thời gian sớm nhất, vì vậy nó là tối ưu không có triệu chứng.


Điều này hoạt động, nhưng chậm hơn một chút (1,5 lần) so với @KennyTM checkEqual1. Tôi cung không chăc tại sao.
tối đa

4
max: Có khả năng vì tôi không bận tâm thực hiện tối ưu hóa first=myList[0] all(x==first for x in myList), có lẽ
ninjagecko

Tôi nghĩ rằng myList [0] được đánh giá với mỗi lần lặp. >>> timeit.timeit ('all ([y == x [0] cho y trong x])', 'x = [1] * 4000', số = 10000) 2.707076672740641 >>> timeit.timeit ('x0 = x [0]; all ([y == x0 cho y trong x]) ',' x = [1] * 4000 ', số = 10000) 2.0908854261426484
Matt Liberty

1
Tất nhiên tôi nên làm rõ rằng việc tối ưu hóa first=myList[0]sẽ đưa ra IndexErrormột danh sách trống, vì vậy những người bình luận đang nói về sự tối ưu hóa mà tôi đã đề cập sẽ phải giải quyết trường hợp cạnh của danh sách trống. Tuy nhiên, bản gốc vẫn ổn ( x==myList[0]vẫn ổn allvì nó không bao giờ được đánh giá nếu danh sách trống).
ninjagecko

1
Đây rõ ràng là cách đúng đắn để nó. Nếu bạn muốn tốc độ trong mọi trường hợp, hãy sử dụng một cái gì đó như numpy.
Henry Gomersall

45

Một bộ công việc so sánh:

len(set(the_list)) == 1

Sử dụng setloại bỏ tất cả các yếu tố trùng lặp.


26

Bạn có thể chuyển đổi danh sách thành một bộ. Một tập hợp không thể có trùng lặp. Vì vậy, nếu tất cả các phần tử trong danh sách gốc giống hệt nhau, tập hợp sẽ chỉ có một phần tử.

if len(sets.Set(input_list)) == 1
// input_list has all identical elements.

Điều này là tốt nhưng nó không ngắn mạch và bạn phải tính toán độ dài của danh sách kết quả.
aaronasterling

15
tại sao không chỉ len(set(input_list)) == 1?
Nick Dandoulakis

2
@codaddict. Điều đó có nghĩa là ngay cả khi hai yếu tố đầu tiên khác biệt, nó vẫn sẽ hoàn thành toàn bộ tìm kiếm. nó cũng sử dụng không gian thừa O (k) trong đó k là số phần tử riêng biệt trong danh sách.
aaronasterling

1
@max. bởi vì việc xây dựng tập hợp xảy ra trong C và bạn có một triển khai xấu. Bạn ít nhất nên làm điều đó trong một biểu thức máy phát điện. Xem câu trả lời của KennyTM để biết cách thực hiện chính xác mà không cần sử dụng bộ.
aaronasterling

1
sets.Set là "Không dùng nữa kể từ phiên bản 2.6: Các loại set / froundredet tích hợp thay thế mô-đun này." (từ docs.python.org/2/l Library / sets.html )
Moberg

21

Đối với những gì nó có giá trị, điều này đã xuất hiện trong danh sách gửi thư ý tưởng python gần đây. Nó chỉ ra rằng đã có một công thức itertools để làm điều này đã: 1

def all_equal(iterable):
    "Returns True if all the elements are equal to each other"
    g = groupby(iterable)
    return next(g, True) and not next(g, False)

Giả sử nó thực hiện rất độc đáo và có một vài thuộc tính tốt đẹp.

  1. Đoản mạch: Nó sẽ ngừng tiêu thụ các mặt hàng từ vòng lặp ngay khi tìm thấy mặt hàng không bằng nhau đầu tiên.
  2. Không yêu cầu các mục để có thể băm.
  3. Đó là lười biếng và chỉ yêu cầu O (1) bộ nhớ bổ sung để thực hiện kiểm tra.

1 Nói cách khác, tôi không thể lấy tín dụng cho đến với giải pháp - cũng không phải tôi có thể mất tín dụng cho dù việc tìm kiếm nó.


3
Nhanh hơn nhiều so với câu trả lời nhanh nhất được liệt kê ở đây trong trường hợp xấu nhất.
ChaimG

return next(g, f := next(g, g)) == f(từ py3.8 tất nhiên)
Chris_Rands

17

Đây là hai cách đơn giản để làm điều này

sử dụng bộ ()

Khi chuyển đổi danh sách thành một tập hợp, các phần tử trùng lặp sẽ bị xóa. Vì vậy, nếu độ dài của bộ chuyển đổi là 1, thì điều này ngụ ý rằng tất cả các phần tử đều giống nhau.

len(set(input_list))==1

Đây là một ví dụ

>>> a = ['not', 'the', 'same']
>>> b = ['same', 'same', 'same']
>>> len(set(a))==1  # == 3
False
>>> len(set(b))==1  # == 1
True

sử dụng tất cả ()

Điều này sẽ so sánh (tương đương) phần tử đầu tiên của danh sách đầu vào với mọi phần tử khác trong danh sách. Nếu tất cả đều tương đương True sẽ được trả về, nếu không Sai sẽ được trả về.

all(element==input_list[0] for element in input_list)

Đây là một ví dụ

>>> a = [1, 2, 3, 4, 5]
>>> b = [1, 1, 1, 1, 1]
>>> all(number==a[0] for number in a)
False
>>> all(number==b[0] for number in b)
True

PS Nếu bạn đang kiểm tra xem toàn bộ danh sách có tương đương với một giá trị nhất định hay không, bạn có thể xác nhận giá trị trong cho input_list [0].


1
Đối với những người quan tâm đến thời gian chạy, việc thực hiện len(set(a))trên danh sách 10.000.000 phần tử mất 0,09 giây trong khi hiệu suất allmất 0,9 giây (lâu hơn 10 lần).
Elliptica

2
Tôi cũng thích câu trả lời này vì tính đơn giản của pythonic, ngoài điểm hiệu suất được đề cập bởi @Elliptica
NickBraunagel

11

Đây là một tùy chọn khác, nhanh hơn so len(set(x))==1với danh sách dài (sử dụng ngắn mạch)

def constantList(x):
    return x and [x[0]]*len(x) == x

Nó chậm hơn 3 lần so với giải pháp thiết lập trên máy tính của tôi, bỏ qua đoản mạch. Vì vậy, nếu phần tử không bằng nhau được tìm thấy trung bình trong phần ba đầu tiên của danh sách, thì trung bình sẽ nhanh hơn.
tối đa

9

Đây là một cách đơn giản để làm điều đó:

result = mylist and all(mylist[0] == elem for elem in mylist)

Điều này phức tạp hơn một chút, nó phát sinh chức năng gọi qua đầu, nhưng ngữ nghĩa được phát âm rõ ràng hơn:

def all_identical(seq):
    if not seq:
        # empty list is False.
        return False
    first = seq[0]
    return all(first == elem for elem in seq)

Bạn có thể tránh một so sánh dư thừa ở đây bằng cách sử dụng for elem in mylist[1:]. Nghi ngờ rằng nó cải thiện tốc độ rất nhiều mặc dù tôi đoán elem[0] is elem[0]vậy nên người phiên dịch có thể thực hiện việc so sánh đó rất nhanh.
Brendan

5

Kiểm tra nếu tất cả các yếu tố bằng đầu tiên.

np.allclose(array, array[0])


Cần mô-đun bên thứ ba.
Bachsau

4

Nghi ngờ đây là "Pythonic nhất", nhưng đại loại như:

>>> falseList = [1,2,3,4]
>>> trueList = [1, 1, 1]
>>> 
>>> def testList(list):
...   for item in list[1:]:
...     if item != list[0]:
...       return False
...   return True
... 
>>> testList(falseList)
False
>>> testList(trueList)
True

sẽ làm các mẹo.


1
forVòng lặp của bạn có thể được tạo ra nhiều Pythonic hơn if any(item != list[0] for item in list[1:]): return False, với chính xác cùng một ngữ nghĩa.
musiphil

4

Nếu bạn quan tâm đến thứ gì đó dễ đọc hơn một chút (nhưng tất nhiên là không hiệu quả,) bạn có thể thử:

def compare_lists(list1, list2):
    if len(list1) != len(list2): # Weed out unequal length lists.
        return False
    for item in list1:
        if item not in list2:
            return False
    return True

a_list_1 = ['apple', 'orange', 'grape', 'pear']
a_list_2 = ['pear', 'orange', 'grape', 'apple']

b_list_1 = ['apple', 'orange', 'grape', 'pear']
b_list_2 = ['apple', 'orange', 'banana', 'pear']

c_list_1 = ['apple', 'orange', 'grape']
c_list_2 = ['grape', 'orange']

print compare_lists(a_list_1, a_list_2) # Returns True
print compare_lists(b_list_1, b_list_2) # Returns False
print compare_lists(c_list_1, c_list_2) # Returns False

Tôi thực sự đang cố gắng xem liệu tất cả các yếu tố trong một danh sách có giống nhau không; không nếu hai danh sách riêng biệt giống hệt nhau.
tối đa

4

Chuyển đổi danh sách thành tập hợp và sau đó tìm số phần tử trong tập hợp. Nếu kết quả là 1, nó có các phần tử giống hệt nhau và nếu không, thì các phần tử trong danh sách không giống nhau.

list1 = [1,1,1]
len(set(list1)) 
>1

list1 = [1,2,3]
len(set(list1)
>3

4

Về việc sử dụng reduce()với lambda. Đây là một mã làm việc mà cá nhân tôi nghĩ là đẹp hơn so với một số câu trả lời khác.

reduce(lambda x, y: (x[1]==y, y), [2, 2, 2], (True, 2))

Trả về một tuple trong đó giá trị đầu tiên là boolean nếu tất cả các mục giống nhau hoặc không.


Có một lỗi nhỏ trong mã như được viết (thử [1, 2, 2]): nó không tính đến giá trị boolean trước đó. Điều này có thể được sửa chữa bằng cách thay thế x[1] == ybằng x[0] and x[1] == y.
schot

3

Tôi sẽ làm:

not any((x[i] != x[i+1] for i in range(0, len(x)-1)))

khi anydừng tìm kiếm iterable ngay khi nó tìm thấy một Trueđiều kiện.


Bạn không cần thêm dấu ngoặc đơn xung quanh biểu thức trình tạo nếu đó là đối số duy nhất.
ninjagecko

vậy all(), tại sao không sử dụng all(x == seq[0] for x in seq)? trông giống pythonic hơn và nên thực hiện tương tự
Chen A.

2
>>> a = [1, 2, 3, 4, 5, 6]
>>> z = [(a[x], a[x+1]) for x in range(0, len(a)-1)]
>>> z
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
# Replacing it with the test
>>> z = [(a[x] == a[x+1]) for x in range(0, len(a)-1)]
>>> z
[False, False, False, False, False]
>>> if False in z : Print "All elements are not equal"

2
def allTheSame(i):
    j = itertools.groupby(i)
    for k in j: break
    for k in j: return False
    return True

Hoạt động trong Python 2.4, không có "tất cả".


1
for k in j: breaktương đương với next(j). Bạn cũng có thể đã làm def allTheSame(x): return len(list(itertools.groupby(x))<2)nếu bạn không quan tâm đến hiệu quả.
ninjagecko

2

Có thể sử dụng bản đồ và lambda

lst = [1,1,1,1,1,1,1,1,1]

print all(map(lambda x: x == lst[0], lst[1:]))

2

Hoặc sử dụng diffphương pháp của numpy:

import numpy as np
def allthesame(l):
    return np.all(np.diff(l)==0)

Và gọi:

print(allthesame([1,1,1]))

Đầu ra:

True

Tôi nghĩ rằng not np.any(np.diff(l))có thể nhanh hơn một chút.
GZ0

2

Hoặc sử dụng phương pháp diff của numpy:

import numpy as np
def allthesame(l):
    return np.unique(l).shape[0]<=1

Và gọi:

print(allthesame([1,1,1]))

Đầu ra:

Thật


Câu trả lời này giống hệt với câu trả lời từ U9-Forward từ năm ngoái.
mhwombat

Có mắt quan sát! Tôi đã sử dụng cùng cấu trúc / API, nhưng phương thức của tôi sử dụng np.unique và hình dạng. Hàm của U9 sử dụng np.all () và np.diff () - Tôi không sử dụng một trong hai hàm đó.
Luis B

1

Bạn có thể làm:

reduce(and_, (x==yourList[0] for x in yourList), True)

Điều khá khó chịu là python khiến bạn nhập các toán tử như thế nào operator.and_. Kể từ python3, bạn cũng sẽ cần phải nhập functools.reduce.

(Bạn không nên sử dụng phương pháp này vì nó sẽ không bị hỏng nếu tìm thấy các giá trị không bằng nhau, nhưng sẽ tiếp tục kiểm tra toàn bộ danh sách. Nó chỉ được đưa vào đây như một câu trả lời cho sự hoàn chỉnh.)


Điều này sẽ không bị đoản mạch. Tại sao bạn thích nó hơn giải pháp khác của bạn?
tối đa

@max: bạn sẽ không, chính xác là vì lý do đó; Tôi bao gồm nó vì lợi ích của sự hoàn chỉnh. Tôi có lẽ nên chỉnh sửa nó để đề cập đến điều đó, cảm ơn.
ninjagecko

1
lambda lst: reduce(lambda a,b:(b,b==a[0] and a[1]), lst, (lst[0], True))[1]

Tiếp theo sẽ ngắn mạch:

all(itertools.imap(lambda i:yourlist[i]==yourlist[i+1], xrange(len(yourlist)-1)))

Mã đầu tiên của bạn rõ ràng là sai: reduce(lambda a,b:a==b, [2,2,2])sản lượng False... Tôi đã chỉnh sửa nó, nhưng theo cách này nó không còn đẹp nữa
berdario

@berdario Sau đó, bạn nên viết câu trả lời của riêng bạn, thay vì thay đổi những gì người khác đã viết. Nếu bạn nghĩ rằng câu trả lời này là sai, bạn có thể nhận xét về nó và / hoặc downvote nó.
Gorpik

3
Tốt hơn hết là sửa một cái gì đó sai, hơn là để nó ở đó cho tất cả mọi người đọc nó, có thể bỏ lỡ những bình luận giải thích tại sao điều đó sai
berdario

3
"Khi nào tôi nên chỉnh sửa bài viết?" "Bất cứ lúc nào bạn cảm thấy bạn có thể làm cho bài đăng tốt hơn và có xu hướng làm như vậy. Chỉnh sửa được khuyến khích!"
berdario

1

Thay đổi danh sách thành một bộ. Sau đó, nếu kích thước của tập hợp chỉ là 1, thì chúng phải giống nhau.

if len(set(my_list)) == 1:

1

Ngoài ra còn có một tùy chọn đệ quy Python thuần túy:

 def checkEqual(lst):
    if len(lst)==2 :
        return lst[0]==lst[1]
    else:
        return lst[0]==lst[1] and checkEqual(lst[1:])

Tuy nhiên vì một số lý do, trong một số trường hợp, hai bậc độ lớn chậm hơn các tùy chọn khác. Xuất phát từ tâm lý ngôn ngữ C, tôi mong muốn điều này sẽ nhanh hơn, nhưng thực tế không phải vậy!

Nhược điểm khác là có giới hạn đệ quy trong Python cần được điều chỉnh trong trường hợp này. Ví dụ sử dụng cái này .


0

Bạn có thể sử dụng .nunique()để tìm số lượng các mục duy nhất trong một danh sách.

def identical_elements(list):
    series = pd.Series(list)
    if series.nunique() == 1: identical = True
    else:  identical = False
    return identical



identical_elements(['a', 'a'])
Out[427]: True

identical_elements(['a', 'b'])
Out[428]: False

0

bạn có thể sử dụng set. Nó sẽ tạo ra một tập hợp và loại bỏ các yếu tố lặp đi lặp lại. Sau đó kiểm tra xem nó có không quá 1 phần tử.

if len(set(your_list)) <= 1:
    print('all ements are equal')

Thí dụ:

>>> len(set([5, 5])) <= 1
True
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.