簡體   English   中英

在python中合並排序

[英]merge sort in python

基本上,我有一堆包含域的文件。 我已經使用.sort(key = func_that_returns_tld)根據其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

我在考慮這個權利嗎? 任何有關如何做到這一點的建議將不勝感激。

如果文件不是很大,則只需將它們全部讀入內存即可(如S. Lott所建議)。 那絕對是最簡單的。

但是,您提到排序規則創建了一個“大量”文件。 如果太大而無法容納在內存中,則可以使用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

除非您的文件很大,否則它將適合內存。

您的偽代碼很難閱讀。 請正確縮進您的偽代碼。 最后的“通過閱讀下一行來循環”是沒有意義的。

基本上就是這個。

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寫入文件,或對其進行進一步處理,或對其進行任何處理。

另一個選擇(同樣,僅當您的所有數據都無法容納到內存中時)是創建一個SQLite3數據庫並在那里進行排序,然后將其寫入文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM