2017-01-26 4 views
0

У меня есть следующие списки 3 Python:Python заменить элементы списка в 2 списках, в индексах подстрок в 3-й список

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 списка всегда будут иметь одинаковую длину.

Start со списком cl_ambient:

Мне нужно найти индексы элементов в cl_ambient, которая является составляющей другого элемента. В этом случае индексы таких элементов имеют индексы 3,5 (Fovx, Fovx_d) и 4,6 (Afree, Afree_d).

Теперь, когда эти показатели будут найдены, нужно использовать эти показатели, чтобы сделать замену в обеих 2 других списках:

Мне нужно заменить более высокий индекс элемент из 2 других списков (temp_farh и manual_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_d ИЛИ Fovx_a.
  2. Подстрока всегда будет перед более длинным элементом в списке cl_ambient.
+0

Что делать, если в 'cl_ambient' имеется более 2 подстрок. Пример: 'FoVx'' FoVx_d' 'FoVx_a' то что будет? – MooingRawr

+0

Спасибо за примечание. Этот сценарий будет недоступен в списке 'cl_ambient'. Я добавлю это в ОП, Большой вопрос. –

+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' мне нужны последние два элемента:' blue', 'yellow'. –

+1

О, подождите. Извините, это работает, если вы просто сделаете одно изменение. Измените первую строку внутри цикла 'for': temp_farh [i] = manual_calib [j]' –

+0

Спасибо, изменил его – ShmulikA