Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用数组以更方便的方式编写长switch语句_Python_Arrays_List_Conditional Statements - Fatal编程技术网

在python中使用数组以更方便的方式编写长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语句

我遇到了一个问题,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
使现代化 为了对问题有一个大致的了解,我在问题中展示的值只是其中的几个。但我从一些评论中意识到,最好给出我作为案例的全部价值观

有三个前缀:小汽车、卡车和公共汽车。 斜线后的前两位数有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中不需要它。