сортировка слиянием в Python - PullRequest
       11

сортировка слиянием в Python

1 голос
/ 24 августа 2010

В основном у меня есть куча файлов, содержащих домены.Я отсортировал каждый отдельный файл по его TLD, используя .sort (key = func_that_returns_tld)

Теперь, когда я сделал это, я хочу объединить все файлы и в итоге получить один массивный отсортированный файл.Я предполагаю, что мне нужно что-то вроде этого:

open all files
read one line from each file into a list
sort list with .sort(key=func_that_returns_tld)
output that list to file
loop by reading next line

Я думаю об этом правильно?Любые советы о том, как это сделать, будут оценены.

Ответы [ 3 ]

8 голосов
/ 24 августа 2010

Если ваши файлы не очень большие, просто прочитайте их все в память (как предлагает С. Лотт). Это определенно будет проще всего.

Однако, вы упоминаете, что сортировка создает один "массивный" файл. Если он слишком большой, чтобы поместиться в памяти, возможно, используйте heapq.merge . Это может быть немного сложнее в настройке, но его преимущество заключается в том, что не требуется, чтобы все итерируемые элементы были одновременно помещены в память.

import heapq
import contextlib

class Domain(object):
    def __init__(self,domain):
        self.domain=domain
    @property
    def tld(self):
        # Put your function for calculating TLD here
        return self.domain.split('.',1)[0]
    def __lt__(self,other):
        return self.tld<=other.tld
    def __str__(self):
        return self.domain

class DomFile(file):
    def next(self):
        return Domain(file.next(self).strip())

filenames=('data1.txt','data2.txt')
with contextlib.nested(*(DomFile(filename,'r') for filename in filenames)) as fhs:
    for elt in heapq.merge(*fhs):
        print(elt)

с data1.txt:

google.com
stackoverflow.com
yahoo.com

и data2.txt:

standards.freedesktop.org
www.imagemagick.org

Выходы:

google.com
stackoverflow.com
standards.freedesktop.org
www.imagemagick.org
yahoo.com
0 голосов
/ 24 августа 2010

Другой вариант (опять же, только если все ваши данные не помещаются в память) - создать базу данных SQLite3 , выполнить там сортировку и записать ее в файл после.

0 голосов
/ 24 августа 2010

Если ваш файл непостижимо велик, он уместится в память.

Ваш псевдокод трудно читать. Пожалуйста, сделайте правильный отступ для своего псевдокода. Финальный «цикл чтения следующей строки» не имеет смысла.

По сути, это так.

all_data= []
for f in list_of_files:
    with open(f,'r') as source:
        all_data.extend( source.readlines() )
all_data.sort(... whatever your keys are... )

Вы сделали. Вы можете записать all_data в файл или обработать его дальше, или все, что вы хотите с ним сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...