如何简化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?