【问题标题】:Can someone explain to me why this second method does not fully update the string?有人可以向我解释为什么第二种方法不能完全更新字符串吗?
【发布时间】:2018-07-14 19:32:42
【问题描述】:

我一直在尝试编写一个将 under_score_words 转换为 camelCaseWords 的函数。以下是我过去会如何做这样的事情;

functionName = "function_for_test_case"
for character in functionName:
    if character == "_":
        functionName = functionName.replace("_" + functionName[functionName.index(character) + 1], functionName[functionName.index(character) + 1].upper())

print functionName

正确输出:

functionForTestCase

不过这一次我最初尝试了另一种方式,我发现这种方式更简洁:

functionName = "function_for_test_case"
for index, character in enumerate(functionName):
    if character == "_":
        functionName = functionName.replace("_" + functionName[index + 1], functionName[index + 1].upper())

print functionName

改为输出:

functionFor_test_case

我很困惑为什么它不起作用...我想这可能是因为我正在更改字符串的长度(通过删除下划线),但是我不确定为什么第一种方法作品。

另外,如果你在第二个函数中打印替换,你可以看到它确实找到并替换了其余的值,但它当然不会保存它们。例如:

functionName = "function_for_test_case"
for index, character in enumerate(functionName):
    if character == "_":
        print functionName.replace("_" + functionName[index + 1], functionName[index + 1].upper())


functionFor_test_case
function_forTest_case
function_for_testCase

据我所知,这些函数本质上是用不同的措辞做同样的事情,谁能解释为什么它们有不同的输出?

编辑:我已经编辑了 for 循环,以便更清楚地了解我正在尝试的内容

【问题讨论】:

  • 您正在更改以下字符的位置。在第一个示例中,您然后再次寻找您想要的字符,而在第二个示例中 i 的值是错误的,因此替换调用找不到,例如“_t”。

标签: python python-2.7 replace enumerate


【解决方案1】:

enumerate(functionName) 依赖于原始字符串。 第一次将 2 个字符替换为 1 (_f -> F) 时,索引将变为无效。所以在某些时候你会遇到这种情况:

index == 12
character == '_'
functionName == 'functionFor_test_case'
functionName[index + 1] == 'e'

因此,您尝试将 _e 替换为 E,但它根本不存在。

顺便说一句,看看camelize() function in inflection library

【讨论】:

  • 任何解释为什么第一个功能确实工作?它应该有同样的问题,即使索引隐藏在那里。
  • 您已经在编辑后的字符串中搜索了 '_' 的位置,并更改了该位置和下一个字符,因此您正在处理编辑后的字符串。您的迭代并不是真正必要的,它只是告诉您有多少下划线。
  • 与第二种解决方案相反,它不依赖于原始字符串。 functionName.index(character) 检查字符的当前索引。
  • @usr2564301,我认为是因为在找到字符的时候就找到了索引,而不是字符串中的每个字符都有一个预设的索引。
  • @Guy: 啊——那里的替换只叫functionName.count('_') 次:) 并且不需要检查每个字符。在这个 count 值上的普通循环将完全一样。
【解决方案2】:

您也不需要进行迭代,因为您已经知道何时进行更改,在每个点 index("_") 都不会失败,因此只需循环该工作即可。您所做的所有迭代都是计算下划线。正在运行的代码是

# you have already assessed that the character is '_' by the if
i = functionName.find('_')
# your iteration had found another underscore, but by using index() here
# you have ignored anything else, so is equivalent to just checking the
# return of index() or find()
while i >= 0:
    functionName = functionName.replace(
        "_" + functionName[functionName.index(character) + 1], 
        functionName[functionName.index(character) + 1].upper())
    i = functionName.find('_')

甚至

# split on all the underscores
parts = functionName.split("_")
# then join - unchanged first word and capitalised rest
out = ''.join(
             [parts[0]] + [w.capitalize() for w in parts[1:]]
             )

请注意,这是未选中的,因为我现在使用的是 iPad。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多