我有一个列表,其中每个元素可以具有不同数量的元素。在lst1中,每个列表项有3个项目,而在lst2中,每个列表项有2个项目。
lst1=[([{'s1'}, 30], [{'s2'}, 28], [{'s3'}, 28]), ([{'s1'}, 30], [{'s2'}, 28], [{'s4'}, 30])]
lst2=[([{'s1'}, 30], [{'s2'}, 28]), ([{'s1'}, 30], [{'s4'}, 22])]
通常,列表元素的数量不是固定的,列表中的每个项自身内部将包含1、2、3、4、5或6个项(在lst1中,每个列表项包含3个项)。给定ls1时应生成的输出如下:
[{'s1','s2','s3'},{'s1','s2','s4'}]
lst2预期会出现以下结果:
[{'s1','s2'},{'s1','s4'}]
以下代码仅适用于lst2:
[x[0][0]|x[1][0] for x in lst2]
实际上,问题是将这部分代码'x [0] [0] | x [1] [0]'转换为动态代码。如果列表的每个项目都有2个子项目,则'x [0] [0] | x [1] [0]'可以正常工作。同时,如果列表中的每个项目都有3个子项目,那么我们应该具有“ x [0] [0] | x [1] [0] | x [2] [0]”,等等。
我知道如何使用多个for循环生成输出。但是,如果有人通过内联循环或其他更快的方式来实现上述代码,我将不胜感激。
答案 0 :(得分:2)
您应该使用通用集合并运算而不是二进制并运算符。
[set.union(*[x[0] for x in item]) for item in lst1]
#[{'s1', 's2', 's3'}, {'s1', 's2', 's4'}]
[set.union(*[x[0] for x in item]) for item in lst2]
#[{'s1', 's2'}, {'s1', 's4'}]