首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python中的数组以更方便的方式编写长开关语句

使用python中的数组以更方便的方式编写长开关语句
EN

Stack Overflow用户
提问于 2014-08-02 14:30:14
回答 4查看 126关注 0票数 1

我已经检查了以下答案:用Python替换switch语句?如何重构Python "switch语句“

但我认为,这两种方法都是指具有单个情况的更简单的开关语句。

我遇到了一个问题,在这种情况下,开关语句应该是这样的:

代码语言:javascript
运行
复制
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

因此,有许多情况下,导致相同的标签。是否有一种使用列表快速完成此操作的方法?在那里我需要这样的东西

代码语言:javascript
运行
复制
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

但是,我必须为每一组能映射到同一标签的病例列一张清单,然后逐一检查。

是否有一种方法来做以下事情,如果没有,那么最简单的方法是什么?

代码语言:javascript
运行
复制
 if view in _any_of_the_lists_i've_made:
     label = the_index_of_that_list

更新

我在这个问题中展示的值只是几个,目的是想对这个问题有一个大致的认识。但我从一些评论中意识到,最好给出我所拥有的全部价值观。

  • 有三个前缀:“汽车”、“卡车”和“公共汽车”。
  • 有4个倾斜角(斜线后的前两位数字)。所以我可以有cars\00inclination_000azimuth,cars\30inclination_000azimuth,cars\60inclination_000azimuth,cars\90inclination_000azimuth
  • 总共有25个不同的方位。有45度的差异,所以我可以让cars\00inclination_000azimuth和cars\00inclination_045azimuth一直到cars\00inclination_315azimuth

因此,我总共对每辆车有25种不同的看法,而对于3辆车,这是75种不同的可能观点,即75种情况。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-02 14:58:51

这里的其他答案是好的,但是基于dict的查找表没有什么问题--如果您计划经常访问它,一个更大的dict比预处理字符串来提取每次查找中的值更快。

代码语言:javascript
运行
复制
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]
票数 0
EN

Stack Overflow用户

发布于 2014-08-02 14:45:37

视图字符串遵循一个模式;它们由<transport>\<inclination>_<azimuth>组成,您的标签实际上只在方位值上有所不同。

将字符串缩小到方位角值,然后使用dict查找标签:

代码语言:javascript
运行
复制
labels = {'000': 1, '045': 2, '090': 2, '135': 2}

label = 0 if view == 'negatives' else labels[view.rpartition('_')[-1][:3]]

这只会从azimuth字符串中取出3位数字。

为了说明这是如何工作的,一个简短的演示:

代码语言:javascript
运行
复制
>>> "cars\\00inclination_000azimuth".rpartition('_')
('cars\\00inclination', '_', '000azimuth')
>>> "cars\\00inclination_000azimuth".rpartition('_')[-1]
'000azimuth'
>>> "cars\\00inclination_000azimuth".rpartition('_')[-1][:3]
'000'

str.rpartition()对最后一个_字符进行分割,从中选择最后一个元素,从最后一个元素中分割前3个字符。

如果您也需要根据不同的倾向进行更改,请单独解析:

代码语言:javascript
运行
复制
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]

通过将视图简化为那些重要的部分,您可以大大减少字典的大小,或者至少需要键入该部分。

当然,直接查找视图字符串会更快。您始终可以从上面的字典生成完整的字符串:

代码语言:javascript
运行
复制
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

然后直接查找你的标签:

代码语言:javascript
运行
复制
label = labels[view]
票数 3
EN

Stack Overflow用户

发布于 2014-08-02 14:45:09

正如一些评论者所指出的,您最好的解决方案是更充分地解析字符串,并获取其中的关键信息,这将减少您的情况。如果由于某种原因你不能这样做,你可以这样做:

代码语言:javascript
运行
复制
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检查的速度。

更好的是,您可以将您的集合列表预处理到一个字典中:

代码语言:javascript
运行
复制
CASE_DICT = { view:label for label, views in enumerate(CASES) for view in views }

def find_label(view):
    return CASE_DICT.get(view, None)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25096074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档