2013-09-07 2 views
0

У меня есть список отсортированных файлов, в которых данные разделяются «\ n». Я хочу объединить их вместе, чтобы получить один отсортированный файл. Я не хочу загружать содержимое всех файлов одновременно. Я использую слияния функции библиотеки heapqФункция heapq.merge() для списка отсортированных файлов

Я написал следующий код

def merge(*flist): 
    for element in heapq.merge(*flist): 
     yield element 

где * п-списка является кортеж, как это -

(<open file '/tmp/000000', mode 'w+b' at 0xb73eba70>, 
<open file '/tmp/000001', mode 'w+b' at 0xb73ebac8>, 
<open file '/tmp/000002', mode 'w+b' at 0xb73ebb20>, 
<open file '/tmp/000003', mode 'w+b' at 0xb73ebb78>, 
<open file '/tmp/000004', mode 'w+b' at 0xb73ebc80>) 

когда я напечатанный элемент выше в цикле Я получаю значение '2 \ n', '44 \ n '. Выходной файл также не находится в отсортированном порядке. Я думаю, проблема связана с новыми символами линии. Как решить эту проблему.

Я пытаюсь исправить это с довольно долгое время, но может не в состоянии разрешить его

+1

Являются ли данные в ваших входных файлах численно отсортированными? – iruvar

+0

Ожидаете ли вы сортировку по ascii-лексикографическому порядку или порядку? Вам может потребоваться преобразовать ваши входные элементы в целые числа. – user2357112

+0

Пожалуйста, разместите несколько примеров данных и ожидаемых результатов. –

ответ

5

Преобразование входных строк в целые числа, чтобы получить числовой вид вместо строки вида:

def merge(*flist): 
    return heapq.merge(*[itertools.imap(int, f) for f in flist]) 

Обратите внимание, что итерация по итератору heapq.merge и получение каждого элемента бессмысленны. Вы можете просто вернуть итератор и сохранить слой косвенности. (Фактически, исходная версия вашей функции могла быть заменена на heapq.merge без каких-либо изменений на сайтах вызовов.)