0

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

4

1 回答 1

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'}]
于 2019-03-21T05:34:19.643 回答