2011-06-27 8 views
1

リスト1のアイテムがリスト2にあるかどうかをチェックしようとしています。それに「_」を付けることによって)。リスト1の項目は元の順序にとどまらなければならないという警告があります。私はネストされたforループと列挙でこれを行う方法を考え出しましたが、より効率的な/より速いメソッドがあるかどうか、おそらくリストの理解やマップが適切かどうか疑問に思っていましたか?前もって感謝します。Python:リストを使用して別々のリスト内のアイテムをチェックし、存在する場合は置換する

リストは以下のとおりです。

headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID'] 
replace = ['Date', 'ID', 'FID'] 

私が使用しているコードは次のとおりです。

for rep in replace: 
     for index, head in enumerate(headers): 
       if rep == head: 
         headers[ index ] = headers[ index ] + '_' 

答えは次のようになります。

['Date_', 'Temp', 'Descrip', 'ID_', 'Lat', 'Long', 'FID_'] 

答えて

2
reps = set(replace) 

for index, head in enumerate(headers): 
    if head in reps: 
     headers[index] += "_" 

これは、リストを変更しますあなたの元のコードがしたように。リスト内包はよりコンパクトですが、新しいリストが作成されます。それがあなたにとって懸念であるかどうかは分かりません。

0

リスト内包はあなたの親友です:)。もちろん

>>> headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID'] 
>>> replace = ['Date', 'ID', 'FID'] 
>>> [i+"_" if i in replace else i for i in headers] 
['Date_', 'Temp', 'Descrip', 'ID_', 'Lat', 'Long', 'FID_'] 

私は読みやすくするために、このようにそれを書き、パフォーマンス上の理由から"".join((i, "_"))i+"_"を変更することができます。

0

あなたはワンライナーを使用することができます - それは、新しいリストが作成されますのでご注意:あなたがいない場合は

for x in (x for x in rVals if x in headers): 
    headers.__setitem__(headers.index(x),x+'_') 
7

headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID'] 
rVals = ['Date', 'ID', 'FID'] 

res = [x if x not in rVals else x+'_' for x in headers] 

OR:

map(lambda x: x if x not in rVals else x+'_', headers) 

ORをリストを変更する必要がある場合は、リスト内包を使用することができます。

headers = [s + "_" if s in replace else s for s in headers] 

replaceに3つ以上の項目が含まれている場合は、リストの代わりにセットを使用します。 (headersがリストの場合、s in headersのテストはリストを反復する必要がありますが、headersがセットの場合は、s in headersは一定時間内に反復せずに評価できます)。

+0

ありがとう。はい、これは私のために働く。私は新しいリストを作成することにあまり心配していませんが、長い/明示的なforループを使わなくてもいいです。私はPythonがRubyに似た方法を持っていたらいいと思う。私はあなたのコメントに関して1つの質問を持っています。なぜ私はセットを使用する必要がありますか?私が理解しているように、「設定されていれば」冗長性がなくなります。私が紛失しているものはありますか? – 9monkeys

+0

'' + '_ ''を.join([s、 "_"]) 'で置き換えると、かなりの余分なパフォーマンスを得ることができますか? – riza

+0

@ 9monkeys:メンバーシップテストは大きなリストよりも大きなセットではかなり高速です - 私は自分の答えにコメントを追加しました。 –

関連する問題