我有一个列表列表,我想先计算每个子列表的大小,然后再查看所有这些子列表的大小是否为2。因此,
my_list = [["obj1", "item1"], ["obj2", "item2", "item1"], ["obj3", "item3"], ["obj4", "item4"], ["obj5", "item5"]]
lengths = [len(x) for x in my_list]
列表lengths
包含每个子列表的大小。如何检查所有子列表的大小是否为2?在我的示例中,它应该失败。
答案 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'
结果:
答案 3 :(得分:0)
使用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
答案 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
函数。