在Python中替换case语句检查字符串中的三个子字符串之一

时间:2018-04-05 18:45:48

标签: python switch-statement

考虑以下字符串:

payments ='cash:yes,square_cash:no,venmo:no'

如果在字符串中找到“cash:yes”,我想返回“现金”。如果在字符串中找到“square_cash:yes”,我想返回“Square Cash”等等。

我认为我很接近,但无法弄明白。这是我的代码:

payments = 'cash:yes,square_cash:no,venmo:no'

def get_payment_type(x):
    return {
        x.find('cash:yes') !=-1: 'Cash',
        x.find('square_cash:yes') !=-1: 'Square Cash',
        x.find('venmo:yes') !=-1: 'Venmo'
    }.get(x, 'not found')    # default if x not found

return {'payment_used': get_payment_type(payments) }

这总是返回“未找到”,所以我知道我的语法已关闭,只是不确定在哪里。

3 个答案:

答案 0 :(得分:1)

要处理任意输入,请使用正则表达式捕获所需的付款类型,然后如果完整付款字符串中存在该类型,请将re.findall找到的部分大写:

import re
payment_types = {'cash:yes,square_cash:no,venmo:no':"cash:yes", 'cash:yes,square_cash:yes,venmo:no':"square_cash:yes"}
final_type = {a:' '.join(i.capitalize() for i in re.findall('^[a-zA-Z_]+(?=:)', b)[0].split('_')) if b in a else None for a, b in payment_types.items()}

输出:

{'cash:yes,square_cash:yes,venmo:no': 'Square Cash', 'cash:yes,square_cash:no,venmo:no': 'Cash'}

答案 1 :(得分:1)

此处您的具体错误是反转字典键和值。

dict.get查找密钥,密钥首先出现在dict语法中:

{"key": "value"}

因此,如果您在答案中反转键和值,它可能会起作用。

但是,我建议进行一些更改:

  1. 使用if / else并返回而不是尝试使用dicts聪明。更容易阅读
  2. 使用x in y代替y.find(x) != -1
  3. 而不是匹配字符串,更健壮,更好,更通用的方法是将字符串解析为字典。
  4. 以下是使用if的例子,而不是:

    if "square_cash:yes" in payments:
        return "square_cash"
    elif "cash:yes" in payments:
        return "Cash"
    elif "venmo:yes" in payments:
        return "Venmo"
    else:
        return "not found"
    

    以下是如何将其解析为字典的快速草图:

    result = {}
    for element in payments.split(","):
        key, value = element.split(":")
        result[key] = value
    

答案 2 :(得分:0)

用逗号分割字符串然后使用你可以使用in检查字符串是否为列表。

<强>实施例

payments = 'cash:no,square_cash:yes,venmo:no'.split(",")
if "cash:yes" in payments:
    print('Cash')
elif "square_cash:yes" in payments:
    print("square_cash")
elif "venmo:yes" in payments:
    print("Venmo")
else:
    print("not found")