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

时间:2017-01-26 19:15:52

标签: python list indexing replace slice

我有以下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列表中的较长元素之前。

1 个答案:

答案 0 :(得分:2)

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

代码:

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']