【发布时间】:2017-07-09 06:29:36
【问题描述】:
如何编写一个高效的“switch”语句,可以为不同的输入返回相同的内容?
Python中的简单开关可以使用这样的字典来实现:
def switch(s):
case = {'phone': '123 456 789', 'website': 'www.example.com'}
return case[s]
这个具有恒定的访问时间,但是我想使用别名,即switch('website') 将返回与switch('site') 等相同的东西,而不重复值,即不使用case = {'website': 'www.example.com, 'site': 'www.example.com}
可以使用的是:
def switch(s):
case = {('telephone', 'number', 'phone'): '123 456 789',
('website', 'site'): 'www.example.com'}
for key, value in case.items():
if s in key:
return value
但这种方法比线性访问时间更差。
可以通过使用
def switch(s):
case = ['123 456 789', 'www.example.com']
aliases = {'telephone': 0, 'number': 0, 'phone': 0,
'website': 1, 'site': 1}
return case[aliases[s]]
但是我有点重复值,如果我决定删除任何答案,我必须编辑aliases'和/或case的返回值(如果我不再想返回@ 987654329@ 我必须从case 中删除它并修改aliases 以便aliases['website'] 和aliases['site'] 返回0 或在case 的第一个单元格中留下虚拟值或制作case 字典)
有没有更好的方法来编写这样的语句?
【问题讨论】:
-
我不认为第二个例子有非线性时间。话虽如此,您的交换机池有多大?
-
在第二个示例中,您线性遍历所有键,并在每个键中检查字符串是否在该键内,这也是无效的。
-
怎么回事?让我们采取 2 个最坏和最好的情况:每个元组键的长度为 1。然后你得到 O(n);有一个元组键。 O(log(n))。
-
要获得
switch('site')(假设字典按照我上面写的方式排序),您必须在找到匹配项之前将'site'与所有5个值进行比较 -
这是
O(1)+O(1)=O(1)
标签: python data-structures conditional