ValueError:具有基数10的int()的无效文字

时间:2016-05-16 20:38:03

标签: python

我是python的初学者。我在代码大战中遇到过这个问题。

Jaden以他通过Twitter提供的一些哲学而闻名。在Twitter上写作时,他几乎总是将每个单词都用于大写。 你的任务是将字符串转换为Jaden Smith的编写方式。这些字符串是来自Jaden Smith的实际引用,但是它们没有像他最初输入的那样大写。

示例:

Not Jaden-Cased:“如果我们的眼睛不真实,镜子怎么能成真呢”

Jaden-Cased:“如果我们的眼睛不真实,镜子怎么能真实”

这是我的尝试(我应该使用函数进行编码)

def toJadenCase(string):
    l = len(string)
    for i in range(0,l):
        if string[i] == ' ':
            y = string[i]
            string[i+1] = chr(int(y)-32)
    return srting
s = raw_input()
print toJadenCase(s)

运行时,出现以下错误

How can mirrors be real if our eyes aren't real  (this is the input string)
Traceback (most recent call last):
  File "jaden_smith.py", line 9, in <module>
    print toJadenCase(s)
  File "jaden_smith.py", line 6, in toJadenCase
    string[i+1] = chr(int(y)-32)
ValueError: invalid literal for int() with base 10: ''

即使在google之后我也无法理解这些错误。任何帮助,将不胜感激。如果我的代码中的其他错误被突出显示并且建议使用更好的代码,我也会很棒。

提前致谢:D

4 个答案:

答案 0 :(得分:1)

正如Goodies指出的那样,字符串不应该用作变量名

Zen of Python之后,这在技术上是一个功能,完全符合您的目标:

def toJadenCase(quote):
    return quote.title()

编辑:

处理撇号的修订版本:

import string

def toJadenCase(quote):
    return string.capwords(quote)

答案 1 :(得分:0)

首先你必须要理解字符串是不可变的,所以你不能在字符串中设置一个字符,而是从旧字符串中构建一个新字符串并替换旧字符串(这通常可以在一次传递中完成,所以它是不是很大的复杂情况)。 其次,对于大多数这类操作,使用字符串对象本身的方法要好得多,而不是从头开始重做所有内容。

说这个问题还有一些复杂性,但是你想要的功能就是在模块字符串中:

import string
s="How can mirrors be real if our eyes aren't real"
newstring=string.capwords(s)

如果你喜欢(为什么?!)DIY解决方案(使用字符串方法):

newstring=' '.join([ss.capitalize() for ss in s.split()])

请注意,使用不带参数的split会在任何空格(例如制表符等)上拆分字符串,我认为这是理想的行为。

答案 2 :(得分:0)

如果你想在不使用已经存在的功能的情况下这样做,我就是这样做的,我会解释一切:

假设您获得的字符串仅包含基于文本的单词,并且所有单词均以字符*

开头
def toJadenCase(string):
    words = string.strip().split() 
# This first strips all empty spaces around the words in the text and then splits the string by spaces (default) otherwise you can add a character inside split in order to split it at the character.  This returns a list of words in the sentence.
    li = [] # initialize empty list
    for word in words:
        word = chr(ord(word[0])-32) + word[1:] 
# So there's a couple of things going on here.  
# I could use .upper() to upper case something (like word[0].upper() + word[1:] 
# in order to get it but I wanted to do it without the use of that.  
# That being said, ord just figures out the ascii number and subtracting
# 32 makes it uppercase.  chr changes it back to a string.  
# Then it can be concatenated to the rest of the word.  
# Strings can be treated as lists in python so word[0] and word[1:] works
Also, word[1:] just means from the 1st index to the end.
    li.append(word) # this appends the word to the list
    return ' '.join(li) # this joins all of the words in the list with a space

现在,如果你想要更简洁的东西(你可以使用.capitalize()):

def toJadenCaseShort(string):
    return ' '.join([x.capitalize() for x in string.strip().split()])

返回:

>>> abc("hello my friends")
'Hello My Friends'

它的作用基本上是它使用列表理解来剥离然后拆分单词,将它们大写,然后将它们与空格连接起来!

当然,您可以使用string.title()作为标记。说但那有什么好玩的? :)

答案 3 :(得分:0)

以下是我的答案

import string
def toJadenCase(str):
    quote = string.capwords(str)
    return quote #Do not use print(quote) as it adds spaces

def toJadenCase(str):     quote = string.capwords(str)     return quote#不要使用print(quote),因为它会添加空格