如何在子列表中找到字符串之间的完全匹配

时间:2020-04-01 08:27:46

标签: python python-3.x list text full-text-search

我有两个由子列表组成的列表,例如:

 conopt = [["element1","element2"],["bla"]] 
 mat = [["element1","elementA"],["bla & etc"]] 

根据该数据,我想填充一个尺寸为len(conopt)x len(mat)的矩阵。由于python默认情况下没有矩阵,因此我将使用另一个带有子列表的列表:

finalmat = [ ["-","X",...,"X"],[...]]

我希望finalmat在存在完全匹配项的情况下具有“ X”(当conopt的子元素与mat的子元素相匹配时),而在没有完全匹配项的情况下具有“-”。但是,我只关心每个子列表的第一个完整匹配。如果conopt的子列表在mat的子列表上具有1个或多个匹配项,则结果应该相同,只有一个“ X”。

我尝试了以下操作:

for i in mat:
    for j in conopt:
         for item in j:
             if item in i:
                 finalmat[mat.index(i)][conopt.index(j)] = "X"

但是结果不正确,因为我已经手动检查了一些数据点,但是结果却不正确。


一些额外的(不太重要)信息:

  • 字符串元素由字母,数字,空格(仅单词之间的空格)和“#&”字符组成。

  • 子列表具有任意数量的字符串。

  • 此数据来自excel文件。我已经手动提取并修改了它以匹配python语法。

  • 输出(finalmat)返回到excel。我正在手动执行此步骤,因为这是一项一次性任务,并且我不想使我的代码更加复杂。

1 个答案:

答案 0 :(得分:1)

mat.index(i)conopt.index(j)子列表中找不到ij。我建议使用enumerate。另外,请确保您正确初始化finalmat

finalmat = [ [ "-" for j in range(len(conopt) ] for i in range(len(mat)) ]
for indexmat, itemmat in enumerate(mat):
    for indexconopt, itemconopt in enumerate(conopt):
         for item in itemconopt:
             if item in itemmat:
                 finalmat[indexmat][indexconopt] = "X"