2017-01-26 2 views
0

を2つのリストのリスト要素を交換してください。リストcl_ambientPythonは、私は、次の3つのPythonのリストを持っている第三のリストに部分文字列のインデックスで、

スタート:

私は別の要素の部分文字列である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として

  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'リストでは不可能です。これを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

関連する問題