可变列表项的长度

Variable list item's length

我有一个列表,其中每个元素都可以有不同数量的元素。在 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 循环生成输出。但是,如果有人对通过内联循环或其他更快的方式实现上述代码有更好的想法,我将不胜感激。

您应该使用通用集合并集运算而不是二元并集运算符。

[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'}]