Подтвердить что ты не робот

Pythonic способ проверить, что длины партий списков одинаковы

У меня есть список списков, которые я буду использовать в своей программе, но я должен быть уверен, что они имеют одинаковую длину, или я буду получать проблемы позже в своем коде.

Какой лучший способ сделать это в Python?

Например, если у меня есть три списка:

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

Я мог бы сделать что-то вроде:

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

Есть ли лучший или более Pythonic способ сделать это?

4b9b3361

Ответ 1

Предполагая, что у вас есть непустой список списков, например

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

вы можете использовать

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

Это будет короткое замыкание, поэтому оно перестанет проверяться, когда встречается первый список с неправильной длиной.

Ответ 2

len(set(len(x) for x in l)) <= 1

Ответ 3

Немного функционального Python:

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

Ответ 4

Каждый вызов max и min будет пересекать весь список, но вам действительно не нужно это делать; вы можете проверить желаемое свойство с помощью одного обхода:

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:])

Это также короткое замыкание, если один из списков имеет разную длину от первой.

Ответ 5

Если l - список длин:

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

В противном случае, используя исходные списки, можно создать список списков:

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