2017-06-06 23 views
0

私は文字列のリストを持っています。各文字列には、必要な文字の特定のシーケンスが含まれています - 探しているのは3つまたは4つの正確なシーケンスがあり、残りの部分には予測できないデータが含まれています。特定のインスタンスなしに私はすべてが、特定の文字列を削除する必要があり、リスト要素の場合:すなわち:私は特定の文字を削除するには、サブまたは.replaceのいずれかを使用することができますが、これは逆である特定の文字列以外の文字列をすべて削除する

sequences = ['sequenceA', 'sequenceB', 'sequenceC'] 
bigList = ['Garbage sequenceB blahblah', 'sequenceA nonsense', 'silliness sequenceC', 'total nonsense'] 
goalList = ['sequenceB', 'sequenceA', 'sequenceC', ''] 

シーケンスリストを順番に保持するように要素を保持する必要があります。私は正規表現にはまだ新しいです - 私はまだ見つからないこれを行う方法はありますか?

答えて

0

>>>[ ''.join([x if x in y else '' for x in sequences]) for y in bigList] 

['sequenceB', 'sequenceA', 'sequenceC', ''] 
+0

ああ、それは素晴らしいです、なぜ私は解決策としてこれを見つけられなかったのか分かりません - 私はそれまで歩いていましたが、それまでに私はそれを思い描いていた。完璧で、ありがとう。 – ThoureaulyRekt

+0

シーケンス要素の再構築を少なくとも最適化してください。すでに存在するデータに対してCPUサイクルを無駄にする必要はありません:bigList内のyの[[(xはyの場合はx、シーケンスの場合は[]]) ] '...まだ不必要な遅いですが、少なくとももう少し正常です。 – zwer

0

はこれを試してみてください:

goalList = ['' for x in range(len(bigList)] 
    for elem in bigList: 
     if sequenceA in bigList[elem]: 
      goalList[elem] = sequenceA 
     if sequenceB in bigList[elem]: 
      goalList[elem] = sequenceB 
     if sequenceA in bigList[elem]: 
      goalList[elem] = sequenceC 

もちろん、あなたがデータベースに持っているものにそれを適応させます。

0

あなたは、単純な二重のループであることを行うことができます:あなたは魔法のワンライナーのような場合は

sequences = ['sequenceA', 'sequenceB', 'sequenceC'] 
bigList = ['Garbage sequenceB blahblah', 'sequenceA nonsense', 'silliness sequenceC', 'total nonsense'] 

goalList = [] 
for element in bigList: 
    for seq in sequences: 
     if seq in element: 
      break 
    goalList.append(seq if seq in element else "") 

print(goalList) 
# prints: ['sequenceB', 'sequenceA', 'sequenceC', ''] 
+0

これは私が前進し始めたことであり、私は正規表現を過度に使用していたと思います。初心者の方に感謝します。 – ThoureaulyRekt

+0

@ThoureaulyRekt - これはあなたがパフォーマンスを気にしている場合に使用する必要があります(そして、例えば 'sequences'が長いリストの場合には必要に応じてさらに高速化することができます)。見た目だけで何かを使用することは、痛い町への道です... – zwer

関連する問題