Python - 在嵌套列表之间和之内查找匹配元素

时间:2015-09-14 21:12:50

标签: python list nested

背景:我有一个冗长的脚本,可以计算给定质量的可能化学公式(基于许多标准),并输出(除其他外)一个代码,该代码对应于该公式所属的化合物的“类别”至。我从批量的群体中计算出公式,这些群体都应该是同一类的成员。然而,考虑到仪器等限制,可以计算每个质量的几个可能的公式。我需要检查所计算的任何类是否对所有峰都是通用的,如果是,则返回匹配/等的位置。

我正在努力研究如何进行迭代if / for循环检查匹配的每个组合(以有效的方式)。

包含的图片总结了问题: http://imgur.com/0vfWW7J

或者在数据结构的实际屏幕截图上: 图片链接在这里 - enter image description here

如您所见,我有一个名为“公式”的列表,其中包含可变数量的元素(在本例中为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]

我想答案可能涉及几个嵌套的forif语句,但我无法理解它。 然后,我需要将匹配的列表(如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

4 个答案:

答案 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