检查嵌套列表中的长度是否相同

时间:2018-11-29 16:28:32

标签: python list

我有一个列表列表,我想先计算每个子列表的大小,然后再查看所有这些子列表的大小是否为2。因此,

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

列表lengths包含每个子列表的大小。如何检查所有子列表的大小是否为2?在我的示例中,它应该失败。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以通过将列表转换为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

答案 2 :(得分:0)

您可以在一行中完成它:

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

首先,我映射了一个实时函数,该函数检查长度是否为2。然后,如果所有值均为True,则应用所有返回True的返回值,否则返回False。

在生产代码中,您可以使用assert

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

结果: enter image description here

答案 3 :(得分:0)

使用all()map()。将lenmy_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

答案 4 :(得分:-1)

您可以遍历长度列表并检查长度。如果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函数。