[英]Finding equal values from a list of list of tuples in Python
After searching a lot without success I need help. 经过大量搜索没有成功,我需要帮助。
I have a list of list of tuples. 我有一个元组列表列表。 Each list inside the list of list represent certain numbers of formulas in my system. 列表列表中的每个列表代表我系统中的特定数量的公式。 Any element in this list is a tuple that represent the type of the element (variable, parameter, constant, an operation...) and the name of the element. 此列表中的任何元素都是一个元组,表示元素的类型(变量,参数,常量,操作...)和元素的名称。 For example for the formulas x1+x2+A1 , x1-x3 and sin(x2)+A1 we'll have: 例如,对于公式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')]
]
I'm trying to determine in which formula each variable appear. 我正在尝试确定每个变量出现在哪个公式中。 In the example above I have that x1 variable is on 1 and 2 formula, x2 variable is on 1 and 3 formula and x3 in 2 formula, so my output will be something like: 在上面的例子中,我认为x1变量是1和2公式,x2变量是1和3公式,x3是2公式,所以我的输出将是这样的:
[
['x1', 1, 2],
['x2', 1, 3],
['x3', 2],
]
At the moment I have very inefficient code that doesn't work at all, but here it is: 目前我的代码非常低效,根本不起作用,但这里是:
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
You could use a collections.defaultdict
to store the formulas (actually the indices inside your list of lists) for each variable: 您可以使用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)
For example with: 例如:
l = [[('VAR', 'x1'), ('PLUS', '+'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')],
[('VAR', 'x1'), ('LESS', '-'), ('VAR', 'x3')],
[('SIN', 'sin'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')]
]
It gives: 它给:
print(dd)
# defaultdict(set, {'x1': {1, 2}, 'x2': {1, 3}, 'x3': {2}})
To get your desired output you only need to convert that to a list again, for example (python-3.x only): 要获得所需的输出,您只需要再次将其转换为列表,例如(仅限python-3.x):
>>> [[name, *sorted(formulas)] for name, formulas in sorted(dd.items())]
[['x1', 1, 2], ['x2', 1, 3], ['x3', 2]]
formula = [
[('VAR', 'x1'), ('PLUS', '+'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')],
[('VAR', 'x1'), ('LESS', '-'), ('VAR', 'x3')],
[('SIN', 'sin'), ('VAR', 'x2'), ('PLUS', '+'), ('PAR', 'A1')]
]
variables = collections.defaultdict(set)
for line_no, line in enumerate(formula):
for typ, value in line:
if typ == 'VAR':
variables[value].add(line_no)
variables
defaultdict(set, {'x1': {0, 1}, 'x2': {0, 2}, 'x3': {1}}) defaultdict(set,{'x1':{0,1},'x2':{0,2},'x3':{1}})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.