2017-01-26 27 views
0

我有以下3 Python列表:Python的替换列表中的元素在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'] 

所有3只列出将始终具有相同的长度。

开始与列表cl_ambient

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

现在,一旦这些指标被发现,我需要同时在其他2列出了使用这些指标进行更换:

我需要从其他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. 按照下面的评论,我会补充一点:不会有多于2子存在于cl_ambient列表中的场景。例如:FoVx,FoVx_d,FoVx_a将不存在。将只有Fovx_dFovx_a
  2. 子字符串将始终在cl_ambient列表中的较长元素之前。
+0

如果'cl_ambient'中有多于2个子字符串会怎么样。例如:'FoVx'' FoVx_d'' FoVx_a'然后会发生什么? – MooingRawr

+0

感谢您的注意。这种情况在'cl_ambient'列表中是不可能的。我会把这个添加到OP,很好的问题。 –

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

谢谢。你的'manual_calib'很好。但是,对于'temp_farh'列表,我需要最后2个元素为'blue','yellow'。 –

+1

哦,等一下。对不起,如果你只是做一个改变,它会起作用将'for'循环中的第一行更改为:'temp_farh [i] = manual_calib [j]' –

+0

谢谢将其更改为 – ShmulikA

相关问题