문자열이 .join에 비해 너무 길면 해결 방법. 오버 플라워러가 발생합니다

StackOverflow https://stackoverflow.com/questions/1219733

  •  10-07-2019
  •  | 
  •  

문제

나는 Pythonchallenge.com에서 Python을 가르치기 위해 Pythonchallenge.com에서 몇 가지 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
도움이 되었습니까?

해결책

String.join 당신이 생각하는 것을하지 않습니다. Join은 단어 목록을 주어진 Seperator와 하나의 문자열로 결합하는 데 사용됩니다. 즉:

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

게시 한 코드 스 니펫은 변수 라인의 모든 문자 사이에 MyString을 삽입하려고 시도합니다. 당신은 그것이 어떻게 빨리 커질 것인지 알 수 있습니다 :-). 전체 파일을 단일 문자열 인 Mystring으로 읽으려고합니까? 그렇다면 문자열을 연결하려는 방식은 다음과 같습니다.

myString = myString + line

내가 여기있는 동안 ... 당신이 파이썬을 배우고 있기 때문에 여기에 다른 제안이 있습니다.

전체 파일을 변수로 읽는 더 쉬운 방법이 있습니다. 예를 들어:

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

(이것은 기존 스트립 () 코드의 정확한 동작이 없지만 실제로 원하는 것을 할 수 있습니다.)

또한, 나는 현악기를 반복하기 위해 실용적인 파이썬 코드 사용 재귀를 권장하지 않을 것입니다. 코드는 문자열의 모든 문자에 대해 함수 호출 (및 스택 항목)을 만듭니다. 또한 Bigstring [1 :]의 모든 사용에 대해 Python이 매우 똑똑 할 것이라고 확신하지 못합니다. 첫 번째 문자가없는 원본의 사본 인 메모리에서 두 번째 문자열을 만들 수 있습니다. 문자열에서 모든 문자를 처리하는 가장 간단한 방법은 다음과 같습니다.

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

마지막으로, "Checked"라는 목록을 사용하여 이전에 특정 캐릭터를 본 적이 있는지 확인합니다. 그러나 목록의 멤버십 테스트 ( "MyChar가 확인 된 경우")는 느립니다. 파이썬에서는 사전을 사용하는 것이 좋습니다.

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

당신이하고있는이 운동은 여러 파이썬 관용구를 배우는 좋은 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top