在搜索了很多没有成功的东西之后,我需要帮助。

我有一个元组列表的列表。列表列表中的每个列表代表系统中一定数量的公式。此列表中的任何元素都是一个元组,表示元素的类型(变量,参数,常量,操作...)和元素的名称。例如,对于公式 x1 + x2 + A1 x1-x3 sin(x2)+ A1 公式,我们将具有:

[
[('VAR', 'x1'), ('PLUS', '+'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')],
[('VAR', 'x1'), ('LESS', '-'), ('VAR', 'x3')],
[('SIN', 'sin'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')]
]

我试图确定每个变量在哪个公式中出现。在上面的示例中,我有x1变量位于1和2公式上,x2变量位于1和3公式上,而x3在2公式上,所以我的输出将类似于:
[
['x1', 1, 2],
['x2', 1, 3],
['x3', 2],
]

目前,我有效率很低的代码根本无法工作,但这里是:
cont = 0
for subL1 in L:
    for subL2 in L:
        if len(subL1) != 1 and len(subL2) != 1:
            if subL1 != subL2 and subL2:
                for x,y in subL1:
                    for z,t in subL2:
                        if (    x == 'VAR'
                            and z == 'VAR'
                            and y == t
                            ):
                            print "Variable", y , "repeated"
        else:
            print "list with 1 lenght\n"
    subL1.pop(0)
cont = cont + 1

最佳答案

您可以使用 collections.defaultdict 来存储每个变量的公式(实际上是列表列表中的索引):

from collections import defaultdict

dd = defaultdict(set)              # use a set as factory so we don't keep duplicates
for idx, subl in enumerate(l, 1):  # iterate over the sublists with index starting at 1
    for subt in subl:              # iterate over each tuple in each sublist
        label, val = subt          # unpack the tuple
        if label == 'VAR':         # if it's a VAR save the index in the defaultdict
            dd[val].add(idx)

例如:
l = [[('VAR', 'x1'), ('PLUS', '+'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')],
     [('VAR', 'x1'), ('LESS', '-'), ('VAR', 'x3')],
     [('SIN', 'sin'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')]
    ]

它给:
print(dd)
# defaultdict(set, {'x1': {1, 2}, 'x2': {1, 3}, 'x3': {2}})

要获得所需的输出,只需要将其再次转换为列表,例如(仅适用于python-3.x):
>>> [[name, *sorted(formulas)] for name, formulas in sorted(dd.items())]
[['x1', 1, 2], ['x2', 1, 3], ['x3', 2]]

09-10 03:33
查看更多