【问题标题】:Python - Find matching elements between and within nested listsPython - 在嵌套列表之间和内部查找匹配元素
【发布时间】:2015-09-14 21:12:49
【问题描述】:

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

我正在努力研究如何进行迭代 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]

我想答案可能涉及几个嵌套的 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

【问题讨论】:

  • 提供一些有用的输入和你想要的输出比截图更有用
  • 您需要什么样的输出形状?
  • 感谢帕德莱克的提示。从长远来看,我想获取所有基于条件匹配的 [?][?] 列表并将它们导出到一个新的列表/数组,我们可以认为它是自信地分配的,因为它们都具有相同的杂原子计数.

标签: python list nested


【解决方案1】:

我会看看使用in 比如

agg = []
for x in arr:
    matched = [y for y in arr2 if x in y]
    agg.append(matched)

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • 谢谢。我已经合并了这个,但试图让它有条件地检查元素......我有点卡住了。
    • “让它有条件地检查元素”是什么意思
    • 想象一下“公式”列表包含三个元素。为了成功匹配,它必须在第一和第二以及第一和第三元素之间找到匹配。 IE。公式[0][1][11] == 公式[1][0][11] == 公式[2][3][11]。我想它应该采用公式 [0] 的所有元素并将它们与公式 [1] 的所有元素进行检查,直到找到匹配项。在那次匹配之后,它需要检查公式[2] 是否匹配。如果找不到匹配项,则应循环回到公式[0]中的下一个元素...如果在所有公式[*]中都匹配,则为真正匹配。
    • 难点在于公式中的元素数量是可变的,而公式中每个元素中的元素数量是可变的。给出的代码可以检查 [0][0][7] 是否匹配 [1][][7] 系列,但它不检查 [2][][7] ...
    • 给出的代码将迭代公式的前两个维度中的所有项目,并再次将其与前两个维度中的所有项目进行比较,检查第三维度中的项目 11 并报告“得到一个匹配”。
    【解决方案3】:

    我不确定我是否完全理解你的数据结构,因此我不会在这里写代码,而是提出一个想法:倒排索引怎么样?

    就像您扫描一次列表一样,创建一种您要查找的值在哪里的摘要。

    您可以创建一个如下组成的字典:

    { 
       'ValueOfInterest1': [ (position1), (position2) ],
       'ValueOfInterest2': [ (positionX) ]
    }
    

    最后你可以看看字典,看看是否有任何值(基本上是列表)的长度 > 1。

    当然,您需要找到一种方法来创建对您有意义的职位格式。

    只是一个想法。

    【讨论】:

      【解决方案4】:

      这能让你前进吗?

      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
      

      【讨论】:

      • 当您对某事投反对票时,请添加解释;我需要了解什么是更可接受的。
      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多