当字符串过长导致.join出错时的解决方法

0 投票
1 回答
3787 浏览
提问于 2025-04-15 13:20

我正在通过pythonchallenge.com上的一些Python问题来学习Python,但遇到了一个障碍,因为我需要使用的字符串太大,Python处理不了。我收到了这个错误:

my-macbook:python owner1$ python singleoccurrence.py
Traceback (most recent call last):
  File "singleoccurrence.py", line 32, in <module>
    myString = myString.join(line)
OverflowError: join() result is too long for a Python string

对于这个问题,我还有什么其他的解决办法呢?我的代码是这样的……

#open file testdata.txt
#for each character, check if already exists in array of checked characters
#if so, skip.
#if not, character.count
#if count > 1, repeat recursively with first character stripped off of page.
# if count = 1, add to valid character array.
#when string = 0, print valid character array.

valid = []
checked = []
myString = ""

def recursiveCount(bigString):
    if len(bigString) == 0:
        print "YAY!"
        return valid
    myChar = bigString[0]
    if myChar in checked:
        return recursiveCount(bigString[1:])
    if bigString.count(myChar) > 1:
        checked.append(myChar)
        return recursiveCount(bigString[1:])
    checked.append(myChar)
    valid.append(myChar)
    return recursiveCount(bigString[1:])

fileIN = open("testdata.txt", "r")
line = fileIN.readline()

while line:
    line = line.strip()
    myString = myString.join(line)
    line = fileIN.readline()

myString = recursiveCount(myString)
print "\n"
print myString

1 个回答

10

string.join 的用法可能和你想的不太一样。join 是用来把一组单词合并成一个字符串,并用你指定的分隔符连接起来。比如:

>>> ",".join(('foo', 'bar', 'baz'))
'foo,bar,baz'

你发的代码片段会试图在变量 line 的每个字符之间插入 myString。你可以想象一下,这样会很快变得庞大 :-)。你是想把整个文件读成一个单一的字符串 myString 吗?如果是这样,你想要连接字符串的方式应该是这样的:

myString = myString + line

顺便说一下...既然你在学习 Python,这里有一些其他的建议。

其实有更简单的方法可以把整个文件读入一个变量。例如:

fileIN = open("testdata.txt", "r")
myString = fileIN.read()

(这可能和你现有的 strip() 代码的行为不完全一样,但可能正好符合你的需求。)

另外,我不建议在实际的 Python 代码中使用递归来遍历字符串。你的代码会为字符串中的每个字符都调用一次函数(并在栈中增加一个条目)。而且我不确定 Python 在处理 bigString[1:] 时是否会很聪明:它可能会在内存中创建一个新的字符串,这个字符串是原始字符串去掉第一个字符后的副本。处理字符串中每个字符的最简单方法是:

for mychar in bigString:
    ... do your stuff ...

最后,你在使用名为 "checked" 的列表来检查某个字符是否之前出现过。但是,列表的成员测试("if myChar in checked")速度比较慢。在 Python 中,使用字典会更好:

checked = {}
...
if not checked.has_key(myChar):
    checked[myChar] = True
    ...

你正在做的这个练习是学习几个 Python 习惯用法的好方法。

撰写回答