0

文字列をクリーンアップするために繰り返される単純な置換辞書を定義したいと思います。たとえば、アドレスをクリーンアップするには、どちらがより良い方法(パフォーマンス、スタイルなど)ですか?

a)

dictionary = {'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}
address = 'North South East West'
for key in dictionary:
    address = address.replace(key, dictionary[key])

またはb)

tuple_list = [('North', 'N'), ('South', 'S'), ('East', 'E'), ('West', 'W')]
address = 'North South East West'
for tuple in tuple_list:
    address = address.replace(tuple[0], tuple[1])

ありがとう!

4

3 に答える 3

3

2つの間に速度の違いはあまりありません。2つのシーケンスを反復処理しており、それらの構造の正確なデータ型のみが異なります。

次の方法dictionaryを使用すると、ループの効率が少し向上する可能性があります.iteritems()

dictionary = {'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}
address = 'North South East West'
for key, value in dictionary.iteritems():
    address = address.replace(key, value)

.iteritems()ペアの反復可能を提供するため、この(key, value)方法はタプルを使用する場合とまったく同じです。

timeitモジュールを使用すると、2つの方法の間に実際の違いがないことがわかります。

>>> import timeit
>>> def dictionary(address, d={'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}):
...     for s, repl in d.iteritems():
...         address = address.replace(s, repl)
... 
>>> def tuples(address, t=[('North', 'N'), ('South', 'S'), ('East', 'E'), ('West', 'W')]):
...     for s, repl in t:
...         address = address.replace(s, repl)
... 
>>> timeit.timeit("test('North South East West')", 'from __main__ import dictionary as test')
2.5873939990997314
>>> timeit.timeit("test('North South East West')", 'from __main__ import tuples as test')
2.5879111289978027
于 2012-12-04T17:02:14.653 に答える
2

それを繰り返すために、リストを使用します。

キーを検索するには、dictを使用します。

最初の例では必ずしも遅いとは限りません。それは、dictが意図しているものではないということだけです。

dictを使用すると、キーで検索する方が(要素を線形に検索するよりも)かなり高速になります。したがって、その目的でコレクションを使用する場合は、1つを使用してください。それ以外の場合はしないでください。

あなたの場合、あなたはあなたの辞書で「北」「南」「東」そして「西」を見つけていません、あなたは逆をしています-あなたの「住所」文字列でそれらを見つけます。

最も速いアルゴリズムは、アドレス文字列をトークン化(分割)し、各要素を実行し、dictを調べて、それを置き換える必要があるかどうかを確認してから、再度参加することです。

それはより効率的であるだけでなく、もちろんそれらが必要でない限り、clbuttic置換を回避します。

于 2012-12-04T17:05:00.990 に答える
0
%%timeit
dictionary = {'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}
address = 'North South East West'
for key in dictionary:
    address = address.replace(key, dictionary[key])
1000000 loops, best of 3: 1.84 us per loop

%%timeit
tuple_list = [('North', 'N'), ('South', 'S'), ('East', 'E'), ('West', 'W')]
address = 'North South East West'
for tuple in tuple_list:
    address = address.replace(tuple[0], tuple[1])
100000 loops, best of 3: 1.9 us per loop

Martijnが言ったように、事実上違いはありません。

于 2012-12-04T17:05:14.637 に答える