Python: Сортировать текстовый файл дважды и разделить на разные файлы? - PullRequest
1 голос
/ 23 февраля 2011

Как отсортировать сначала по длине строки, затем по алфавиту, а затем разделить по длине строки на отдельные файлы?У меня есть файл списка слов, например, так:

a

actors

an

b

batter

but

Мне требуется один файл (1.txt, 2.txt) для каждой длины строки, каждый из которых отсортирован по алфавиту.Как это можно сделать?

Полученный файл должен выглядеть следующим образом:

1.txt

a
b
...

2.txt

an
by
...

и т. Д..

Ответы [ 4 ]

1 голос
/ 23 февраля 2011
from collections import defaultdict

OUTF = "{0}.txt".format

def sortWords(wordList):
    d = defaultdict(list)
    for word in wordList:
        d[len(word)].append(word)
    return d

def readWords(fname):
    with open(fname) as inf:
        return [word for word in (line.strip() for line in inf.readlines()) if word]

def writeWords(fname, wordList):
    wordList.sort()
    with open(fname, 'w') as outf:
        outf.write('\n'.join(wordList))

def main():
    for wordLen,wordList in sortWords(readWords('words.txt')).iteritems():
        writeWords(OUTF(wordLen), wordList)

if __name__=="__main__":
    main()
1 голос
/ 23 февраля 2011

Вы можете передать функцию в сортировку. Что-то вроде lambda a, b: (len(a) < len(b)) if (len(a) != len(b)) else (a < b) должно это сделать.

0 голосов
/ 23 февраля 2011

Вы можете сделать это так:

text = [x.strip() for x in """a

actors

an

b

batter

but""".splitlines() if x.strip()]

files = {}
for word in text:
    n = len(word)
    if n not in files:
        files[n] = open("%d.txt" % n, 'wt')
    files[n].write(word + "\n")

for file in files.itervalues():
    file.close()
0 голосов
/ 23 февраля 2011

добавить к предыдущему ответу:

files = {}
for word in sort(words, lambda a,b: (len(a) < len(b)) if (len(a) != len(b)) else (a < b)):
    if len(word) not in files:    
         files[len(word)] = open("{0}.txt".format(len(word)), "w")
    files[len(word)].write("{0}\n".format(word))             
...