3

リスト内の各項目の空白をダッシュ​​に置き換えるこのループを単純化する方法はありますか?

for item in a_list:
    alist[alist.index(item)] = '-'.join(item.split(" "))

またはこれは良いですか?

for item in a_list:
    alist[alist.index(item)] = item.replace(" ", "-")

注:上記のソリューションは、Davidが提案したように、このリストの最初のオカレンスのみを更新します。リスト内包表記を使用して上記のタスクを実行します。

単語のリストがあり、ダッシュがあるものとないものがあります。a_listの項目は次のようになります。

this-item has a-dash
this has dashes
this should-have-more dashes
this foo
doesnt bar
foo
bar

出力は次のようになります。リスト内のすべてのアイテムには、空白ではなくダッシュが含まれている必要があります。

this-item-has-a-dash
this-has-dashes
this-should-have-more-dashes
this-foo
doesnt-bar
foo
bar
4

2 に答える 2

7

リスト内包表記を使用します。

a_list = [e.replace(" ", "-") for e in a_list]
于 2012-09-18T23:39:37.580 に答える
2

この方法を使用していることに気付いたときindexは、おそらく何か間違ったことをしているでしょう。(常にではありませんが、多くの場合、それについて考える必要があります。)

この場合、リストを順番に繰り返し処理しており、現在の要素のインデックスを知りたいと考えています。繰り返し検索するのは時間がかかります(O(N)アルゴリズムがO(N ^ 3)になります)が、さらに重要なのは、壊れやすいことです。たとえば、同じアイテムが2つある場合、インデックスは2番目のアイテムを見つけることはありません。

これはまさにそのenumerateために作成されたものです。だから、これを行います:

for i, item in enumerate(a_list):
    alist[i] = '-'.join(item.split(" "))

一方、ループをリスト内包に置き換えることができます。

a_list = ['-'.join(item.split(" ")) for item in a_list]

これは遅くなるか、より多くのメモリを使用する可能性があります(リストをインプレースで変更するのではなくコピーするため)が、それはほぼ確実に問題ではなく(元のコードほど遅くなることはありません)、不変ですアルゴリズムはより単純で推論が容易であり、より柔軟です。このバージョンは、リストだけでなく、タプルまたは任意の反復可能で呼び出すことができます。

もう1つの改善点として、本当に必要なsplitjoinか、それとも単に使用できるのreplaceか。

a_list = [item.replace(" ", "-") for item in a_list]

代わりに正規表現を使用することもできます。これは、同様の場合にパフォーマンスや読みやすさの点で優れている可能性がありますが、この場合は実際には悪くなると思います。ですから、ここに着いたら、それで終わりです。

于 2012-09-19T00:13:04.587 に答える