我想定义一个简单的替换字典,它将被迭代以清理字符串。例如,要清理地址,这是更好的练习(性能,风格等)?
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])
谢谢!
答案 0 :(得分: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)
对的迭代,因此此方法与使用元组完全相同。
使用timeit
module,您可以看到两种方法之间没有真正的区别:
>>> 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
答案 1 :(得分:1)
如果只是迭代它,你会使用一个列表。
要查找密钥,请使用dict。
首先不一定要慢,只是它不是dict的用途。
如果使用dict,按键查找将比使用dict要快得多(因此尝试线性查找元素),因此如果要将该集合用于此目的,请使用一个。否则不要。
在你的情况下,你没有在你的字典中找到“North”“South”“East”和“West”,你正在进行反向 - 在你的“地址”字符串中找到它们。
您最快的算法可能是对您的地址字符串进行标记(拆分),遍历每个元素并在dict中查找是否应该替换它,然后重新加入。
它不仅会更有效率,而且会避免克服替换,除非你当然想要那些。
答案 2 :(得分: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所说,实际上没有区别。