我有两个长度相同、超过 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]]]
至于您重新设计的问题,我仍然不太清楚您到底想要完成什么。我假设您想要基于元素的匹配。通过使用这种方法,我们可以找到两个列表的匹配序列。 对于所呈现的情况,我们只需要迭代数组的所有元素即可。
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]]
动态时间扭曲(DTW)或快速动态时间扭曲(FastDTW)可以完成这项工作。它们的目的是找到两个序列之间的最佳匹配,并返回最佳路径。