2016-08-15 6 views
0

長さが数千文字の文字列があり、印刷時にそれを分離して約100 \nが含まれています。私は、特定の部分文字列と特定の個々の文字を含む行を削除しています。一時的なリストで文字列を修正するPythonicの方法

この部分は既に完成していますが、私は最も多くのものについて興味がありますpythonicこれを行う方法は、私が選択した方法が健全であると仮定すると、適切な命名規則が一時的なリスト。

active_config = active_config.split('\n') 

for i, elem in enumerate(active_config): 
    # Delete entire line based off match 
    if "cmdStatus=" in elem or "<?xml" in elem: 
     active_config.remove(elem) 

    #Delete individual char based off match 
    elem = elem.replace("\r","") 
# Delete last line if it is '*' 
if active_config[-1] == "*": 
    del active_config[-1] 

active_config = '\n'.join(active_config) 

Iはリストとして文字列active_configを上書きし、次に文字列として再び特定の要素を削除した後に完了したことを上書きすることを選択しました。

リストは、いくつかの行と個々の文字を削除するために使用されたものであり、他の場所では使用されていないので、私はそれを呼び出す必要がありますか?おそらくそれをactive_config_listまたはtemp_active_config、またはちょうどtempと呼んでください。ここで

+3

は、リストの変更されましたそれはリストの中であなたの立場を捨ててしまう傾向があるので、悪い考えです。また、 'remove'は要素を再度見つけなければならないので、リストから要素を削除するのは本当に遅い方法です。既存のリストから削除するのではなく、新しいリストを作成する。 – user2357112

+1

また、リストの_every_行をテストして、最後の行であるかどうかを調べる必要はありません。そしてあなたはあなたの '.join'コールを後方に持っています。これは 'separator_string.join(list_of_strings)' –

+0

@ PM2Ringでなければなりません。それを指摘してくれてありがとう。 –

答えて

1

filterを使用してこの種の問題のための神託のソリューションです:

active_config = """this is an 
example which contains 
words like 
cmdStatus= 
cmdStatus2 
or other 
weird <?lxml 
tags 
""" 

lines = active_config.splitlines() 
tokens = ["cmdStatus=", "<?lxml"] 
print '\n'.join(filter(lambda x: not any(w in x for w in tokens), lines)) 
+0

ああ、私はラムダリストの理解を知っているが、それを使用することを忘れることが多い! そしてこの質問の他の部分に答えてください。 'lines'のような一時的なvarは、同じvar名を再利用して2回以上書くという私の方法よりも好ましいのでしょうか? –

+0

@BrianCスプリット( '\ n')を使う代わりに私のコードを編集しましたが、代わりにsplitlines()を使うことをお勧めします。 varの名前を保持したり再利用したりすることについては、私は他の使い方のためにオリジナルの入力を保持することをお勧めします。あなたはメモリの問題に関心がない限り、おそらくそうではありません:) – BPL

+0

私は言ったように、私は基本的に 'a =" some \ nstuff "'と 'a = a.split ( "\ n") '、aの要素を変更し、' a = "\ n" .join(a) 'を修正します。だからここではコンベンションはありません、ただ好みですか? –

1

リストの内包のカップルは、あまりにもそれを行います:あなたはそれを反復処理している間

active_config = active_config.split('\n') 

temp_list = [z for z in active_config if "cmdStatus=" in z or "<?xml" in z] 

if temp_list[-1] == "*": 
    temp_list = "\n".join([x.replace("\r", "") for x in temp_list[:-1]]) 

#Do whatever you need to do with temp_list here 
関連する問題