我有两个由子列表组成的列表,例如:
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。我正在手动执行此步骤,因为这是一项一次性任务,并且我不想使我的代码更加复杂。
答案 0 :(得分:1)
mat.index(i)
和conopt.index(j)
在子列表中找不到i
和j
。我建议使用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"