背景:我有一个冗长的脚本,可以计算给定质量的可能化学公式(基于许多标准),并输出(除其他外)一个代码,该代码对应于该公式所属的化合物的“类别”至。我从批量的群体中计算出公式,这些群体都应该是同一类的成员。然而,考虑到仪器等限制,可以计算每个质量的几个可能的公式。我需要检查所计算的任何类是否对所有峰都是通用的,如果是,则返回匹配/等的位置。
我正在努力研究如何进行迭代if / for循环检查匹配的每个组合(以有效的方式)。
如您所见,我有一个名为“公式”的列表,其中包含可变数量的元素(在本例中为12)。
公式中的每个元素都是一个列表,同样具有可变数量的元素。
这些列表中的每个元素都是一个列表,包含 15 7个元素。 我希望比较不同元素中的第11个元素。
即。
formulae[0][0][11] == formulae[1][0][11]
formulae[0][0][11] == formulae[1][1][11]
...
formulae[0][1][11] == formulae[11][13][11]
我想答案可能涉及几个嵌套的for
和if
语句,但我无法理解它。
然后,我需要将匹配的列表(如formulae[0][0]
)导出到新数组。
除非我这样做错了?
感谢您的帮助!
编辑: 1-我的数据结构略有变化,我需要检查元素[?] [?] [4]和[?] [?] [5]和[?] [?] [6]和[?] [ ?] [7]都匹配另一个列表中的相应元素。
我试图调整一些建议的代码,但不能完全使用它......
check_O = 4
check_N = 5
check_S = 6
check_Na = 7
# start with base (left-hand) formula
nbase_i = len(formulae)
for base_i in range(len(formulae)): # length of first index
for base_j in range(len(formulae[base_i])): # length of second index
count = 0
# check against comparison (right-hand) formula
for comp_i in range(len(formulae)): # length of first index
for comp_j in range(len(formulae[comp_i])): # length of second index
if base_i != comp_i:
o_test = formulae[base_i][base_j][check_O] == formulae[comp_i][comp_j][check_O]
n_test = formulae[base_i][base_j][check_N] == formulae[comp_i][comp_j][check_N]
s_test = formulae[base_i][base_j][check_S] == formulae[comp_i][comp_j][check_S]
na_test = formulae[base_i][base_j][check_Na] == formulae[comp_i][comp_j][check_Na]
if o_test == n_test == s_test == na_test == True:
count = count +1
else:
count = 0
if count < nbase_i:
print base_i, base_j, comp_i,comp_j
o_test = formulae[base_i][base_j][check_O] == formulae[comp_i][comp_j][check_O]
n_test = formulae[base_i][base_j][check_N] == formulae[comp_i][comp_j][check_N]
s_test = formulae[base_i][base_j][check_S] == formulae[comp_i][comp_j][check_S]
na_test = formulae[base_i][base_j][check_Na] == formulae[comp_i][comp_j][check_Na]
if o_test == n_test == s_test == na_test == True:
count = count +1
else:
count = 0
elif count == nbase_i:
matching = "Got a match! " + "[" +str(base_i) + "][" + str(base_j) + "] matches with " + "[" + str(comp_i) + "][" + str(comp_j) +"]"
print matching
else:
count = 0
答案 0 :(得分:0)
我会看一下使用in
,例如
agg = []
for x in arr:
matched = [y for y in arr2 if x in y]
agg.append(matched)
答案 1 :(得分:0)
Prune的回答不对,应该是这样的:
check_index = 11
# start with base (left-hand) formula
for base_i in len(formulae): # length of first index
for base_j in len(formulae[base_i]): # length of second index
# check against comparison (right-hand) formula
for comp_i in len(formulae): # length of first index
for comp_j in len(formulae[comp_i]): # length of second index
if formulae[base_i][base_j][check_index] == formulae[comp_i][comp_j][check_index]:
print "Got a match"
# Here you add whatever info *you* need to identify the match
答案 2 :(得分:0)
我不确定我是否完全理解您的数据结构,因此我不打算在这里编写代码,但提出一个想法:倒排索引怎么样?
就像您扫描列表一样,创建了您要查找的值的摘要。
您可以创建一个如下组成的字典:
{
'ValueOfInterest1': [ (position1), (position2) ],
'ValueOfInterest2': [ (positionX) ]
}
然后在最后你可以查看字典,看看是否有任何值(基本上是列表)的长度&gt; 1。
当然,您需要找到一种方法来创建对您有意义的位置格式。
只是一个想法。
答案 3 :(得分:-2)
这会让你前进吗?
check_index = 11
# start with base (left-hand) formula
for base_i in len(formulae): # length of first index
for base_j in len(formulae[0]): # length of second index
# check against comparison (right-hand) formula
for comp_i in len(formulae): # length of first index
for comp_j in len(formulae[0]): # length of second index
if formulae[base_i][base[j] == formulae[comp_i][comp_j]:
print "Got a match"
# Here you add whatever info *you* need to identify the match