如何将规则应用到Python列表?

问题描述 投票:0回答:1

我有以下形式的清单

[1, C0, C1, C1*C0, C0**2, C0*C1, C0*C1*C0, B0, B0*C0, B0*C1, B0*C1*C0, B0*C0**2, B0*C0*C1, B0*C0*C1*C0, B1, B1*C0, B1*C1, B1*C1*C0, B1*C0**2, B1*C0*C1, B1*C0*C1*C0, B1*B0, B1*B0*C0, B1*B0*C1, B1*B0*C1*C0, B1*B0*C0**2, B1*B0*C0*C1, B1*B0*C0*C1*C0, B0**2, B0**2*C0, B0**2*C1, B0**2*C1*C0,...]

A0、A1、B0、B1、C0、C1 被定义为 ncpol2sdpa 包中的运算符。由于这些运算符应该是酉且埃尔米特的,因此它们应该平方为一。他们尤其应该遵守规则

A0^2 = 1、A1^2 = 1、B0^2 = 1、B1^2 = 1、C0^2 = 1、C1^2 = 1。

现在我想将这些规则应用于所有列表元素,以便预期结果如下所示

[1, C0, C1, C1*C0, 1, C0*C1, C0*C1*C0, B0, B0*C0, B0*C1, B0*C1*C0, B0, B0*C0*C1, B0*C0*C1*C0, B1, B1*C0, B1*C1, B1*C1*C0, B1, B1*C0*C1, B1*C0*C1*C0, B1*B0, B1*B0*C0, B1*B0*C1, B1*B0*C1*C0, B1*B0, B1*B0*C0*C1, B1*B0*C0*C1*C0, C0, C1, C1*C0,...]

我的第一个想法是将列表中的每个元素转换为字符串,以便扫描所有元素的特定模式,如 A0^2、A1^2 等,并将其设置为 1。但我不知道如何转换字符串元素返回到运算符元素中,并且还认为可能应该有一个更优雅的解决方案来对列表元素设置一些约束。

python operators rules list-manipulation
1个回答
0
投票

执行此类操作的一种快速方法是编写一个可以在列表理解期间用作过滤器的函数。假设您已经编写了一个函数来转换字符串元素(例如 A0^2 --> 1),那么您可以使用列表压缩将所有内容转换为: yourlist = [原始列表中 x 的函数(x)]

但是!如果您之后需要检索操作员项目,最好的选择可能是使用字典,因为它们几乎可以存储任何内容。在这种情况下,您需要形成一些新的字典 ={},并说字典[字符串等效] = 运算符。这样,您就可以从给定的字符串中检索运算符。

此外,您可以一次性完成这一切,如下所示: yourlist = [string_to_operator_dict[function(x)] 对于原始列表中的 x]

IFF 您已经拥有 1) 函数和 2) 字典[字符串]-> 已填充的运算符

© www.soinside.com 2019 - 2024. All rights reserved.