Проверьте, идентичны ли длины внутри вложенного списка - PullRequest
0 голосов
/ 29 ноября 2018

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

my_list = [["obj1", "item1"], ["obj2", "item2", "item1"], ["obj3", "item3"], ["obj4", "item4"], ["obj5", "item5"]]
lengths = [len(x) for x in my_list]

Список lengths содержит размер каждого подсписка.Как я могу проверить, все ли мои подсписки имеют размер два или нет?В моем примере это должно не получиться.

Ответы [ 5 ]

0 голосов
/ 29 ноября 2018

Использование all () и map () .Сопоставление len с my_list для определения длины sub-list.

my_list = [["obj1", "item1"], ["obj2", "item2", "item1"], ["obj3", "item3"], ["obj4", "item4"], ["obj5", "item5"]]
all(i == 2 for i in map(len, my_list))

Вывод:

False

Если вы хотите проверить, все длины идентичны.

my_list = [["obj1", "item1"], ["obj2", "item2"], ["obj3", "item3"], ["obj4", "item4"], ["obj5", "item5"]]
len(set(list(map(len, my_list)))) <=1 

Вывод:

True
0 голосов
/ 29 ноября 2018

Вы можете сделать это в одной строке:

print(all(map(lambda x:len(x)==2, my_list)))

Сначала я сопоставляю функцию на лету, которая проверяет, равна ли длина двум.Затем я применяю все, что возвращает True, если все значения True, иначе False.

В рабочем коде вы можете использовать assert

assert all(map(lambda x:len(x)==2, my_list)), 'Not all have length 2'

Результаты: enter image description here

0 голосов
/ 29 ноября 2018

Вы можете определить количество уникальных элементов в списке, преобразовав его в set.Если длина набора равна 1, а единственным элементом набора является 2, то вы знаете, что каждый список имеет длину 2.

my_list = [["obj1", "item1"], ["obj2", "item2", "item1"], ["obj3", "item3"], ["obj4", "item4"], ["obj5", "item5"]]
lengths = [len(x) for x in my_list]

print(set(lengths))
# {2, 3}

len(set(lengths)) == 1 and set(lengths).pop() == 2
# False
0 голосов
/ 29 ноября 2018

Вы можете просто просмотреть список длин и проверить их длину.Если все элементы в lengths равны 2, тогда true в противном случае false:

my_list = [["obj1","item1"], ["obj2","item2", "red" ]]
lengths = [len(x) for x in my_lists]

allLensEqual = True
for I in lengths:
    if I != 2:
        allLensEqual = False
        break

В качестве альтернативы, вы можете просто использовать функцию any.

0 голосов
/ 29 ноября 2018

Используйте all с выражением генератора.

>>> my_list = [[1, 2], [3, 4], [5]]
>>> all(len(sub) == 2 for sub in my_list)
False
>>> 
>>> my_list[-1].append(6)
>>> all(len(sub) == 2 for sub in my_list)
True

Или если длина не обязательно должна быть специально равна двум:

>>> subs = iter(my_list)
>>> len_ = len(next(subs))
>>> all(len(sub) == len_ for sub in subs)
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...