Python 替换 2 个列表中的列表元素,位于第 3 个列表中子字符串的索引处

Python replace list elements in 2 lists, at indexes of substrings in 3rd list

我有以下 3 个 Python 列表:

cl_ambient = ['BRy', 'WilmB', 'Hgan', 'FoVx', 'Afree', 'FoVx_d', 'Afree_d']
temp_farh = ['grey', 'DarkOrange', 'r', 'black', 'black', 'black', 'black']
manual_calib = ['white', 'white', 'white', 'blue', 'yellow', 'green', 'darkgreen']

所有 3 个列表的长度始终相同。

从列表开始 cl_ambient:

我需要找到 cl_ambient 中元素的索引,它是另一个元素的子字符串。在这种情况下, 这些元素的索引位于索引 3,5 (Fovx,Fovx_d) 和 4,6 (Afree,Afree_d).

现在,一旦找到这些索引,我需要使用这些索引在其他两个列表中进行替换:

我需要用较低索引元素替换其他 2 个列表(temp_farhmanual_calib)中较高索引元素 来自 manual_calib 列表。所以,如果我们手动执行此操作,替换应该是:

temp_farh[5] = temp_farh[3]
temp_farh[6] = temp_farh[4]

manual_calib[5] = temp_farh[3]
manual_calib[6] = temp_farh[4]

我需要以编程方式进行这些替换。我无法手动执行此操作,因为列表可能会很长。

要求输出:

输出应该是:

cl_ambient = ['BRy', 'WilmB', 'Hgan', 'FoVx', 'Afree', 'FoVx_d', 'Afree_d']
temp_farh = ['grey', 'DarkOrange', 'r', 'black', 'black', 'blue', 'yellow']
manual_calib = ['white', 'white', 'white', 'blue', 'yellow', 'blue', 'yellow']

问题:

有没有办法从这 3 个列表中以编程方式提取这些子字符串元素?

附加信息:

  1. 根据下面的评论,我将添加以下内容:不会出现 cl_ambient 列表中存在超过 2 个子字符串的情况。示例:FoVxFoVx_dFoVx_a 将不存在。只会有 Fovx_dFovx_a.
  2. 子字符串将始终在 cl_ambient 列表中较长的元素之前。

答案分为两部分,首先找到我们要替换的所需索引,然后进行替换

代码:

cl_ambient = ['BRy', 'WilmB', 'Hgan', 'FoVx', 'Afree', 'FoVx_d', 'Afree_d']
temp_farh = ['grey', 'DarkOrange', 'r', 'black', 'black', 'black', 'black']
manual_calib = ['white', 'white', 'white', 'blue', 'yellow', 'green', 'darkgreen']


# for each index search match on the higher indexes, 
# if found save it on the changes list as (high, low) tuple
changes = [(i+1+j, i) for i, s1 in enumerate(cl_ambient)
           for j, s2 in enumerate(cl_ambient[i+1:]) 
           if (s1 in s2 or s2 in s1)]
print(changes)

# do the change on both lists
for i, j in changes:
    temp_farh[i] = manual_calib[j]
    manual_calib[i] = manual_calib[j]

print(temp_farh)
print(manual_calib)

输出:

[(5, 3), (6, 4)]
['grey', 'DarkOrange', 'r', 'black', 'black', 'blue', 'yellow']
['white', 'white', 'white', 'blue', 'yellow', 'blue', 'yellow']