سؤال

#!/usr/bin/python

import random
import string

appendToFile = open("appendedFile", "a" )

# Generator

for i in range(1, 100000):

    chars = "".join( [random.choice(string.letters) for i in xrange(15)] )
    chars2 = "".join( [random.choice(string.letters) for i in xrange(15)] )

    appendToFile.write(chars + ":" + chars2 + "\n")

appendToFile.close()

رمز تعديل من هذا السؤال.

ينشئ التعليمات البرمجية أعلاه 100،000 سطر من النص العشوائي بتنسيق السلسلة: السلسلة. الملف النصي الناتج هو 3.1 ميغابايت.

كيف يمكن للملف الأبدي بسرعة، باستخدام السلسلة الأولى في السلسلة: السلسلة؟ القضية غير ذات صلة.

فرز فقاعة بطيئة جدا، لا؟

هل كانت مفيدة؟

المحلول

هذا سريع جدا (أقل من 1 ثانية على جهاز الكمبيوتر الخاص بي). يستخدم نوعا غير حساس للحالة، وهو ما يعني ما تقصده "القضية غير ذات صلة"؟

#!/usr/bin/python

appendToFile = open("appendedFile", "r")
sortToFile = open("sortedFile", "w")

for line in sorted(appendToFile, key = str.lower):
    sortToFile.write(line)

نصائح أخرى

النهج الأول الواضح هو ببساطة استخدام ميزة الفرز المدمجة في بيثون. هل هذا ليس ما في الاعتبار؟ إذا لم يكن كذلك، لماذا؟ مع 100000 سطر فقط من النص العشوائي، سيكون الترتيب المدمج سريعا للغاية.

lst = open("appendedFile", "rt").readlines()
lst.sort(key=str.lower)

منجز. يمكننا أن نفعل ذلك كطائرة واحدة إذا كنت تريد حقا:

lst = sorted(open("appendedFile", "rt").readlines(), key=str.lower)

تحرير: أنا فقط التحقق، و strings.letters يتضمن كل من الأحرف الكبيرة والأحرف الصغيرة. لذلك، يتم تعديل التعليمات البرمجية أعلاه لتكون غير حساسة لحالة الأحرف.

تحرير: المزيد عند الفرز في بيثون: http://wiki.python.org/moin/howto/sorting.

جرب هذا (غير حساس للحالة):

l=file(appendedFile).readlines()
l.sort(key=lambda x:x.lower())

لهذه الأنواع من الأحجام المحظورة ليست ضرورية حقا (توقيت على جهازي البطيء ؛-):

christophe@orion:~$ time python -c "l=file('appendedFile').readlines();l.sort(key=lambda x:x.lower())"

real    0m0.615s
user    0m0.576s
sys 0m0.024s
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top