如何简化Python中从下划线到camelcase的这种转换?

我写了下面的函数,它将下划线转换为camelcase,第一个单词是小写,即“get_this_value” - >“getThisValue”。 此外,我还要求保留前导和尾部下划线,并且还需要双(下划线等)下划线,如果有的话,也就是说

"_get__this_value_" -> "_get_ThisValue_".

代码:

def underscore_to_camelcase(value):
    output = ""
    first_word_passed = False
    for word in value.split("_"):
        if not word:
            output += "_"
            continue
        if first_word_passed:
            output += word.capitalize()
        else:
            output += word.lower()
        first_word_passed = True
    return output

我感觉上面的代码是用非Pythonic风格编写的,尽管它按预期工作,所以寻找如何简化代码并使用列表推导来编写它。


你的代码很好。 我想你想解决的问题是, if first_word_passed看起来有点难看。

解决这个问题的一个选择是发电机。 我们可以很容易地为第一次输入返回一个事件,而后面的所有输入都会返回一个。 由于Python具有一流的功能,我们可以让生成器返回我们想要用来处理每个单词的函数。

然后,我们只需要使用条件运算符,这样我们就可以在列表理解中处理由双下划线返回的空条目。

所以,如果我们有一个词,我们称之为生成器来获取用来设置事件的函数,如果我们不这样做,我们只使用_使生成器保持不动。

def underscore_to_camelcase(value):
    def camelcase(): 
        yield str.lower
        while True:
            yield str.capitalize

    c = camelcase()
    return "".join(c.next()(x) if x else '_' for x in value.split("_"))

除了将第一个单词作为小写字母之外,这个作品是有效的。

def convert(word):
    return ''.join(x.capitalize() or '_' for x in word.split('_'))

(我知道这并不完全符合你的要求,而且这个线程已经很老了,但是因为在Google上搜索这样的转换时它非常突出,所以我想我会添加我的解决方案以防别人帮助其他人)。


我个人更喜欢正则表达式。 这是一个对我来说很有用的技巧:

import re
def to_camelcase(s):
    return re.sub(r'(?!^)_([a-zA-Z])', lambda m: m.group(1).upper(), s)

使用unutbu的测试:

tests = [('get__this_value', 'get_ThisValue'),
         ('_get__this_value', '_get_ThisValue'),
         ('_get__this_value_', '_get_ThisValue_'),
         ('get_this_value', 'getThisValue'),
         ('get__this__value', 'get_This_Value')]

for test, expected in tests:
    assert to_camelcase(test) == expected
链接地址: http://www.djcxy.com/p/31793.html

上一篇: How can I simplify this conversion from underscore to camelcase in Python?

下一篇: How to (de)serialize a XmlException with Newtonsoft JSON?