我已经检查了以下答案:用Python替换switch语句?和如何重构Python "switch语句“
但我认为,这两种方法都是指具有单个情况的更简单的开关语句。
我遇到了一个问题,在这种情况下,开关语句应该是这样的:
switch(view) {
case "negatives":
label = 0;
break;
case "cars\\00inclination_000azimuth":
case "buses\\00inclination_000azimuth":
case "trucks\\00inclination_000azimuth":
label = 1;
break;
case "cars\\00inclination_045azimuth":
case "buses\\00inclination_045azimuth":
case "trucks\\00inclination_045azimuth":
case "cars\\00inclination_090azimuth":
case "buses\\00inclination_090azimuth":
case "trucks\\00inclination_090zimuth":
case "cars\\00inclination_135azimuth":
case "buses\\00inclination_135azimuth":
case "trucks\\00inclination_135azimuth":
label = 2;
break;
# and so on
因此,有许多情况下,导致相同的标签。是否有一种使用列表快速完成此操作的方法?在那里我需要这样的东西
a = ["cars\\00inclination_045azimuth","buses\\00inclination_045azimuth","trucks\\00inclination_045azimuth","cars\\00inclination_090azimuth","buses\\00inclination_090azimuth", "trucks\\00inclination_090zimuth","cars\\00inclination_135azimuth","buses\\00inclination_135azimuth","trucks\\00inclination_135azimuth"]
if view in a:
label = 2
但是,我必须为每一组能映射到同一标签的病例列一张清单,然后逐一检查。
是否有一种方法来做以下事情,如果没有,那么最简单的方法是什么?
if view in _any_of_the_lists_i've_made:
label = the_index_of_that_list
更新
我在这个问题中展示的值只是几个,目的是想对这个问题有一个大致的认识。但我从一些评论中意识到,最好给出我所拥有的全部价值观。
因此,我总共对每辆车有25种不同的看法,而对于3辆车,这是75种不同的可能观点,即75种情况。
发布于 2014-08-02 14:58:51
这里的其他答案是好的,但是基于dict的查找表没有什么问题--如果您计划经常访问它,一个更大的dict比预处理字符串来提取每次查找中的值更快。
def get_label(val):
label_map = {
"negatives": 0,
"cars\\00inclination_000azimuth": 1,
"buses\\00inclination_000azimuth": 1,
"trucks\\00inclination_000azimuth": 1,
"cars\\00inclination_045azimuth": 2,
(...etc...)
}
return label_map[val]
发布于 2014-08-02 14:45:37
视图字符串遵循一个模式;它们由<transport>\<inclination>_<azimuth>
组成,您的标签实际上只在方位值上有所不同。
将字符串缩小到方位角值,然后使用dict
查找标签:
labels = {'000': 1, '045': 2, '090': 2, '135': 2}
label = 0 if view == 'negatives' else labels[view.rpartition('_')[-1][:3]]
这只会从azimuth
字符串中取出3位数字。
为了说明这是如何工作的,一个简短的演示:
>>> "cars\\00inclination_000azimuth".rpartition('_')
('cars\\00inclination', '_', '000azimuth')
>>> "cars\\00inclination_000azimuth".rpartition('_')[-1]
'000azimuth'
>>> "cars\\00inclination_000azimuth".rpartition('_')[-1][:3]
'000'
str.rpartition()
对最后一个_
字符进行分割,从中选择最后一个元素,从最后一个元素中分割前3个字符。
如果您也需要根据不同的倾向进行更改,请单独解析:
labels = {
None: 0,
('00', '000'): 1,
('00', '045'): 2,
('00', '090'): 2,
('00', '135'): 2,
# etc.
}
if view == 'negatives':
key = None
else:
key = view.partition('\\')[-1][:2], view.rpartition('_')[-1][:3]
label = labels[key]
通过将视图简化为那些重要的部分,您可以大大减少字典的大小,或者至少需要键入该部分。
当然,直接查找视图字符串会更快。您始终可以从上面的字典生成完整的字符串:
for key, label in labels.items():
if key is None:
labels['negatives'] = label
continue
for vehicle in ('cars', 'trucks', 'buses'):
labels['{}\\{}inclination_{}azimuth'.format(vehicle, *key)] = label
然后直接查找你的标签:
label = labels[view]
发布于 2014-08-02 14:45:09
正如一些评论者所指出的,您最好的解决方案是更充分地解析字符串,并获取其中的关键信息,这将减少您的情况。如果由于某种原因你不能这样做,你可以这样做:
CASES = [
{
"negatives",
},
{
"cars\\00inclination_000azimuth",
"buses\\00inclination_000azimuth",
"trucks\\00inclination_000azimuth",
},
{
"cars\\00inclination_045azimuth",
"buses\\00inclination_045azimuth",
"trucks\\00inclination_045azimuth",
"cars\\00inclination_090azimuth",
"buses\\00inclination_090azimuth",
"trucks\\00inclination_090zimuth",
"cars\\00inclination_135azimuth",
"buses\\00inclination_135azimuth",
"trucks\\00inclination_135azimuth",
},
]
def find_label(view):
for label, views in enumerate(CASES):
if view in views:
return label
注意,我使用了sets来加快view in views
检查的速度。
更好的是,您可以将您的集合列表预处理到一个字典中:
CASE_DICT = { view:label for label, views in enumerate(CASES) for view in views }
def find_label(view):
return CASE_DICT.get(view, None)
https://stackoverflow.com/questions/25096074
复制相似问题