0

我正在处理 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
4

1 回答 1

10

string.join不符合您的想法。join 用于将单词列表与给定的分隔符组合成一个字符串。IE:

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

您发布的代码片段将尝试在变量行中的每个字符之间插入 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”的列表来查看您以前是否见过某个特定角色。但是列表上的成员资格测试(“如果检查了 myChar”)很慢。在 Python 中,你最好使用字典:

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

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

于 2009-08-02T20:21:24.150 回答