الحلول عند سلسلة طويلة جدا ل.join. يحدث OverflowError

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

  •  10-07-2019
  •  | 
  •  

سؤال

وأعمل من خلال بعض المشاكل الثعبان على pythonchallenge.com لتعليم نفسي الثعبان ولقد ضرب حاجز، لأن سلسلة أنا أن استخدام كبيرة جدا لالثعبان في التعامل معها. أتلقى هذا الخطأ:

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(('foo', 'bar', 'baz'))
'foo,bar,baz'

وهذا المقتطف الذي نشر ومحاولة إدراج myString بين كل حرف في خط متغير. يمكنك أن ترى كيف أن ستحصل كبيرة بسرعة :-). هل تحاول قراءة الملف بأكمله في سلسلة واحدة، myString؟ إذا كان الأمر كذلك، بالطريقة التي تريدها لسلسلة سلاسل مثل هذا:

myString = myString + line

وبينما أنا هنا ... منذ كنت تعلم بايثون هنا بعض الاقتراحات الأخرى.

وهناك طرق أسهل لقراءة الملف بأكمله إلى متغير. على سبيل المثال:

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

(وهذا لن يكون سلوك المحدد من التعليمات البرمجية الشريط الموجود لديك ()، ولكن في الواقع قد تفعل ما تريد).

وبالإضافة إلى ذلك، أنصح ابدأ عملية بيثون استخدام كود العودية لتكرار عبر سلسلة. سوف التعليمات البرمجية إجراء مكالمة وظيفة (وإدخال كومة) من أجل كل حرف في السلسلة. كما أنني لست متأكدا سوف بيثون تكون ذكية جدا حول جميع استخدامات bigString [1]:: قد يسبب ذلك سلسلة ثانية في الذاكرة وهذا هو نسخة من الأصلي دون الحرف الأول. إن أبسط طريقة لمعالجة كل حرف في السلسلة:

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

وأخيرا، كنت تستخدم قائمة يدعى "فحص" لمعرفة ما إذا كنت قد رأيت من أي وقت مضى حرف معين من قبل. ولكن الاختبار عضوية في قوائم ( "إذا myChar في فحص") بطيء. في بيثون كنت أفضل حالا باستخدام القاموس:

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

وهذه ممارسة تفعلونه هو وسيلة رائعة لتعلم العديد من التعابير بيثون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top