我正在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
Run Code Online (Sandbox Code Playgroud)
我对此问题有哪些替代方案?我的代码看起来像这样......
#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
Run Code Online (Sandbox Code Playgroud)
Nel*_*son 10
string.join不符合您的想法.join用于将单词列表与给定的分隔符组合成单个字符串.即:
>>> ",".join(('foo', 'bar', 'baz'))
'foo,bar,baz'
Run Code Online (Sandbox Code Playgroud)
您发布的代码段将尝试在变量行中的每个字符之间插入myString.你可以看到它会如何迅速变大:-).您是否尝试将整个文件读入单个字符串myString?如果是这样,你想要连接字符串的方式是这样的:
myString = myString + line
Run Code Online (Sandbox Code Playgroud)
虽然我在这里...因为你在学习Python这里有一些其他的建议.
有更简单的方法可以将整个文件读入变量.例如:
fileIN = open("testdata.txt", "r")
myString = fileIN.read()
Run Code Online (Sandbox Code Playgroud)
(这不会具有现有strip()代码的确切行为,但实际上可能会执行您想要的操作.)
另外,我绝不会推荐实用的Python代码使用递归迭代字符串.您的代码将为字符串中的每个字符进行函数调用(和堆栈条目).另外我不确定Python是否会非常聪明地使用bigString [1:]:它可能会在内存中创建第二个字符串,它是没有第一个字符的原始副本.处理字符串中每个字符的最简单方法是:
for mychar in bigString:
... do your stuff ...
Run Code Online (Sandbox Code Playgroud)
最后,您正在使用名为"checked"的列表来查看您之前是否曾见过某个特定字符.但是对列表的成员资格测试("如果myChar in checked")很慢.在Python中,你最好使用字典:
checked = {}
...
if not checked.has_key(myChar):
checked[myChar] = True
...
Run Code Online (Sandbox Code Playgroud)
你正在做的这个练习是学习几个Python习语的好方法.
| 归档时间: |
|
| 查看次数: |
2929 次 |
| 最近记录: |