如何匹配两个长度相同的列表

问题描述 投票:0回答:2

我有两个长度相同、超过 11 行的列表。我希望 df[0] 在 df2[0] 中的任何位置查找匹配项,并希望 df[1] 在 df2[1] 的任何位置查找匹配项等等...而不是我一一输入,有一个更简单的方法?

   df = [[[1, 5,7,9,12,13,17],
   [2,17,18,23,32,34,45],
   [3,5,11,33,34,36,45]],
  [[6,21,22,50,56,58,72],
  [7,5,12,13,55,56,74],
  [8,23,24,32,56,58,64]]]

    df2 = [[[100,5,12,15,27,32,54],
    [120,10,17,18,19,43,55],
    [99,21,32,33,34,36,54]],
   [[41,16,32,45,66,67,76],
    [56,10,11,43,54,55,56],
    [77,12,16,18,19,21,23]]]
    

我希望我的输出是这样的:

    output = [[[[5,12,],[17]],
      [[17,18],[32,34,36]]],
      [[[55,56],[32]],[[56]]]
python list
2个回答
0
投票

至于您重新设计的问题,我仍然不太清楚您到底想要完成什么。我假设您想要基于元素的匹配。通过使用这种方法,我们可以找到两个列表的匹配序列。 对于所呈现的情况,我们只需要迭代数组的所有元素即可。

matches
函数将找到所有匹配的序列。在嵌套 for 循环中使用它可以进行元素方面的比较。匹配序列是写入
matched_sequences
的十个序列,它将保存所有已识别的匹配。

import difflib

df = [
    [[1, 5, 7, 9, 12, 13, 17], [2, 17, 18, 23, 32, 34, 45], [3, 5, 11, 33, 34, 36, 45]],
    [[6, 21, 22, 50, 56, 58, 72], [7, 5, 12, 13, 55, 56, 74], [8, 23, 24, 32, 56, 58, 64]],
]

df2 = [
    [[100, 5, 12, 15, 27, 32, 54], [120, 10, 17, 18, 19, 43, 55], [99, 21, 32, 33, 34, 36, 54]],
    [[41, 16, 32, 45, 66, 67, 76], [56, 10, 11, 43, 54, 55, 56], [77, 12, 16, 18, 19, 21, 23]],
]


def matches(list1, list2):
    while True:
        mbs = difflib.SequenceMatcher(None, list1, list2).get_matching_blocks()
        if len(mbs) == 1:
            break
        for i, j, n in mbs[::-1]:
            if n > 0:
                yield list1[i : i + n]
            del list1[i : i + n]
            del list2[j : j + n]


matched_sequences = []

for row_df, row_df2 in zip(df, df2):
    for el1, el2 in zip(row_df, row_df2):
        matched_sequences.extend(list(matches(el1, el2)))

print(matched_sequences)

这将产生已识别的匹配项:

[[12], [5], [17, 18], [33, 34, 36], [55, 56], [23]]

0
投票

动态时间扭曲(DTW)或快速动态时间扭曲(FastDTW)可以完成这项工作。它们的目的是找到两个序列之间的最佳匹配,并返回最佳路径。

© www.soinside.com 2019 - 2024. All rights reserved.