2012-02-08 32 views
13

Tôi có một số danh sách mà tôi sẽ sử dụng trong chương trình của mình, nhưng tôi cần phải chắc chắn rằng chúng có cùng độ dài hoặc tôi sẽ gặp vấn đề sau trong mã của tôi.Cách Pythonic để kiểm tra độ dài của nhiều danh sách giống nhau

Cách tốt nhất để làm điều này bằng Python là gì?

Ví dụ, nếu tôi có ba danh sách:

a = [1, 2, 3] 
b = ['a', 'b'] 
c = [5, 6, 7] 

tôi có thể làm một cái gì đó như:

l = [len(a), len(b), len(c)] 
if max(l) == min(l): 
    # They're the same 

Có cách nào tốt hơn hoặc Pythonic hơn để làm điều này?

Trả lời

24

Giả sử bạn có danh sách danh sách không trống, ví dụ:

my_list = [[1, 2, 3], ['a', 'b'], [5, 6, 7]] 

bạn có thể sử dụng

n = len(my_list[0]) 
if all(len(x) == n for x in my_list): 
    # whatever 

này sẽ ngắn mạch, vì vậy nó sẽ dừng việc kiểm tra khi danh sách đầu tiên với chiều dài sai là gặp phải.

+1

+1 để thoát có thể sớm nhất là 'my_list [1]' ... một số khác lại thiếu điều này. – Droogans

8
len(set(len(x) for x in l)) <= 1 
+3

Có thể làm '<= 1' để xử lý trường hợp khi' l' trống ... –

3

Mỗi cuộc gọi đến maxmin sẽ chuyển toàn bộ danh sách, nhưng bạn không thực sự cần thực hiện điều đó; bạn có thể kiểm tra thuộc tính mong muốn bằng một lần truyền tải:

def allsamelength(lst_of_lsts): 
    if len(lst_of_lsts) in (0,1): return True 
    lfst = len(lst_of_lsts[0]) 
    return all(len(lst) == lfst for lst in lst_of_lsts[1:]) 

Điều này cũng sẽ ngắn mạch nếu danh sách có độ dài khác với danh sách đầu tiên.

4

Một chút Python chức năng:

>>> len(set(map(len, (a, b, c)))) == 1 
False 
0

Nếu l là danh sách dài:

l = [len(a), len(b), len(c)] 
if len(set(l))==1: 
    print 'Yay. List lengths are same.' 

Nếu không, bằng cách sử dụng danh sách ban đầu, người ta có thể tạo ra một danh sách liệt kê:

d=[a,b,c] 
if len(set(len(x) for x in d)) ==1: 
    print 'Yay. List lengths are same.' 
Các vấn đề liên quan