在python中使用数组以更方便的方式编写长switch语句
我已经检查了以下答案: 和 但我认为这两种说法都是指带有单个案例的更简单的switch语句 我遇到了一个问题,switch语句看起来像这样:在python中使用数组以更方便的方式编写长switch语句,python,arrays,list,conditional-statements,Python,Arrays,List,Conditional Statements,我已经检查了以下答案: 和 但我认为这两种说法都是指带有单个案例的更简单的switch语句 我遇到了一个问题,switch语句看起来像这样: switch(view) { case "negatives": label = 0; break; case "cars\\00inclination_000azimuth": case "buses\\00inclination_000azimuth": case "trucks\\00inclination_000a
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
使现代化
为了对问题有一个大致的了解,我在问题中展示的值只是其中的几个。但我从一些评论中意识到,最好给出我作为案例的全部价值观
有三个前缀:小汽车、卡车和公共汽车。
斜线后的前两位数有4个倾角。所以我可以有cars\00indivity\u 000方位角,或者cars\30indivity\u 000方位角,或者cars\60indivity\u 000方位角,或者cars\90indivity\u 000方位角
总共有25个不同的方位角。有45度的差异,所以我可以有cars\00倾角\u 000方位角和cars\00倾角\u 045方位角一直到cars\00倾角\u 315方位角
因此,每辆车总共有25个视图,有3辆车,即75个不同的可能视图,即75个案例。正如一些评论者所指出的,最好的解决方案是更全面地解析字符串,并获取其中的关键信息,这将减少案例。如果由于某种原因您不能,您可以这样做:
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
请注意,我使用了集合来加速视图中的视图检查
更好的是,您可以将集合列表预处理到单个字典中:
CASE_DICT = { view:label for label, views in enumerate(CASES) for view in views }
def find_label(view):
return CASE_DICT.get(view, None)
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
视图字符串遵循一种模式;它们由最后一个字符上的\ \拆分组成,我们从中选择最后一个元素,并从最后一个元素中分割前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]
通过将视图缩小到那些重要的部分,可以大大减少字典的大小,或者至少减少需要键入的部分
当然,直接查找视图字符串会更快。您始终可以从上述字典生成完整字符串:
CASE_DICT = { view:label for label, views in enumerate(CASES) for view in views }
def find_label(view):
return CASE_DICT.get(view, None)
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]
这里的其他答案是好的,但是基于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]
由于车辆:倾角:方位角值的映射存在巨大的重叠,因此可以使用来描述映射中重叠字符串的元组 假设您可以将所有情况下的标签描述为“2”,其中车辆为['cars'、'bus'、'trucks'],方位角为['0']中的任何一个,倾角为['45'、'90'、'135']中的任何一个-如您的示例所示 你可以做:
from itertools import product
vehicles=['cars', 'buses', 'trucks']
switch={}
switch.update({t:2 for t in product(vehicles, ['0'], ['45', '90', '135'])})
print switch
# {('buses', '0', '90'): 2, ('buses', '0', '45'): 2, ('cars', '0', '135'): 2, ('trucks', '0', '135'): 2, ('trucks', '0', '90'): 2, ('cars', '0', '45'): 2, ('trucks', '0', '45'): 2, ('cars', '0', '90'): 2, ('buses', '0', '135'): 2}
然后很容易添加额外的“case”值,以借用C的含义。更新、产品和dict理解:
>>> switch.update({t:1 for t in product(vehicles, ['0'], ['0'])})
>>> switch
{('buses', '0', '90'): 2, ('buses', '0', '45'): 2, ('cars', '0', '135'): 2, ('trucks', '0', '135'): 2, ('trucks', '0', '90'): 2, ('cars', '0', '45'): 2, ('trucks', '0', '45'): 2, ('cars', '0', '90'): 2, ('buses', '0', '135'): 2, ('cars', '0', '0'): 1, ('buses', '0', '0'): 1, ('trucks', '0', '0'): 1}
对车辆:倾角:方位角值组合的每个可描述铲斗重复上述操作
然后,您可以直接从感兴趣的值的元组的键值分配标签:
>>> label=switch[('cars', '0', '0')]
>>> label
1
不用把它们全部打印出来
您还可以使用.get来设置默认值:
>>> switch.get(('bicycle','0','0'), 'default')
'default'
对于您提到的问题,公认的答案是使用dict。这在这里也适用。因此,我会使用def-fx:return{'a':1,'b':2,}[x]来代替这个:def-fx:return{'a':'b':'c':1,'d':'e':2}[x]?处理字符串以提取方位角并将其用作字典键似乎很容易。如果将字符串减少到仅000方位角部分,则已将其减少到仅5个选项。我打赌总共不超过9个方位角值,8个方位角值和1个“负值”。字符串的每个部分都很重要-我刚刚更新了问题。太快了!我的标签实际上在倾角和方位角的组合上有所不同。但是,是的,交通工具不重要。那么我将如何使用它呢?简单地说,是这样的:mylabel=get_labelnegatives;对或者,您可以将数组从函数中拉出,然后执行label_map[负片]。-除了结尾的分号。python中不需要它。