0

我想定义一个简单的替换字典,它将被迭代以清理字符串。例如,清理地址,哪个是更好的做法(性能、样式等)?

一个)

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

两者之间不会有太大的速度差异。您正在迭代两个序列,只有这些结构的确切数据类型不同。

通过使用以下方法,您的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)对,因此此方法与使用元组完全相同。

使用timeitmodule,您可以看到两种方法之间没有真正的区别:

>>> 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,按键查找将快得多(比尝试线性查找元素),因此如果您打算为此目的使用集合,请使用一个。否则不要。

在您的情况下,您没有在字典中找到“北”“南”“东”和“西”,而是在做相反的事情 - 在“地址”字符串中找到它们。

您最快的算法可能是标记(拆分)您的地址字符串,遍历每个元素并在字典中查找以查看是否应该替换它,然后重新加入。

它不仅会更有效率,而且会避免乱七八糟的替换,除非你当然想要这些。

于 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 回答