Объедините отсортированные списки в Python

Нет - это не имеет значения в малейшем. На NT .bat и .cmd расширение оба заставляют процессор cmd.exe обрабатывать файл точно таким же образом.

Дополнительная интересная информация о command.com по сравнению с cmd.exe в WinNT-системах-классов от MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx ):

Это поведение показывает довольно тонкую функцию Windows NT, который очень важен. 16-разрядная оболочка MS-DOS (COMMAND.COM), который поставлется с Windows NT, особенно разработана для Windows NT. Когда команда вводится для выполнения этой оболочкой, это на самом деле не выполняет его. Вместо этого это упаковывает текст команды и отправляет его в 32-разрядный командный процессор CMD.EXE для выполнения. Поскольку все команды на самом деле выполняются CMD.EXE (командный процессор Windows NT), 16-разрядная оболочка наследовала все функции и средства полной оболочки Windows NT.

12
задан Paul Tarjan 21 July 2009 в 10:26
поделиться

8 ответов

Стандартная библиотека Python предлагает способ для этого: heapq.merge .
Как сказано в документации, это очень похоже на использование itertools (но с большим количеством ограничений); если вы не можете жить с этими ограничениями (или если вы не используете Python 2.6), вы можете сделать что-то вроде этого:

sorted(itertools.chain(args), cmp)

Однако я думаю, что оно имеет ту же сложность, что и ваше собственное решение, хотя использование итераторов должно дать неплохую оптимизацию и увеличение скорости.

14
ответ дан 2 December 2019 в 18:20
поделиться

Мне нравится ответ Роберто Лиффредо. Я не знал о heapq.merge (). Хммм.

Вот как выглядит полное решение с использованием руководства Роберто:

class Obj(object):
    def __init__(self, p) :
        self.points = p
    def __cmp__(self, b) :
        return cmp(self.points, b.points)
    def __str__(self):
        return "%d" % self.points

a = [Obj(1), Obj(3), Obj(8)]
b = [Obj(1), Obj(2), Obj(3)]
c = [Obj(100), Obj(300), Obj(800)]

import heapq

sorted = [item for item in heapq.merge(a,b,c)]
for item in sorted:
    print item

Или:

for item in heapq.merge(a,b,c):
    print item
2
ответ дан 2 December 2019 в 18:20
поделиться

Я не знаю, будет ли это быстрее, но вы можете упростить это с помощью:

def GetObjKey(a):
    return a.points

return sorted(a + b + c, key=GetObjKey)

Вы также, конечно, можете использовать cmp вместо , если хотите, нажмите .

0
ответ дан 2 December 2019 в 18:20
поделиться

Используйте модуль bisect . Из документации: «Этот модуль поддерживает поддержание списка в отсортированном порядке без необходимости сортировать список после каждой вставки».

import bisect

def magic(*args):
    r = []
    for a in args:
        for i in a:
            bisect.insort(r, i)
    return r
2
ответ дан 2 December 2019 в 18:20
поделиться

Вместо использования списка вы можете использовать [куча] ( http://en.wikipedia.org/wiki/Heap_ (data_structure) .

Это вставка O (log (n)), поэтому слияние a, b и c будет O (n log (n))

В Python вы можете использовать модуль heapq .

2
ответ дан 2 December 2019 в 18:20
поделиться

Вот и все: полностью функционирующая сортировка слиянием для списков (адаптированная из моей сортировки здесь ):

def merge(*args):
    import copy
    def merge_lists(left, right):
        result = []
        while left and right:
            which_list = (left if left[0] <= right[0] else right)
            result.append(which_list.pop(0))
        return result + left + right
    lists = list(args)
    while len(lists) > 1:
        left, right = copy.copy(lists.pop(0)), copy.copy(lists.pop(0))
        result = merge_lists(left, right)
        lists.append(result)
    return lists.pop(0)

Назовите это так:

merged_list = merge(a, b, c)
for item in merged_list:
    print item

Для большей точности я внесу пару изменений в ваш класс Obj:

class Obj(object):
    def __init__(self, p) :
        self.points = p
    def __cmp__(self, b) :
        return cmp(self.points, b.points)
    def __str__(self):
        return "%d" % self.points
  • Наследовать от объекта
  • Передать self в __ init __ ()
  • Сделать __ cmp __ функцией-членом
  • Добавить str () , чтобы представить Obj в виде строки
0
ответ дан 2 December 2019 в 18:20
поделиться

Однострочное решение с использованием сортировки:

def magic(*args):
  return sorted(sum(args,[]), key: lambda x: x.points)

IMO это решение очень читабельно.

Используя модуль heapq, он мог бы быть более эффективным, но у меня есть не тестировал. Вы не можете указать функцию cmp / key в heapq, поэтому вы должны реализовать Obj для неявной сортировки.

import heapq
def magic(*args):
  h = []
  for a in args:
    heapq.heappush(h,a)
  return [i for i in heapq.heappop(h)
0
ответ дан 2 December 2019 в 18:20
поделиться

Я задал аналогичный вопрос и получил отличные ответы:

Лучшее решение этого вопроса - это варианты алгоритма слияния, о которых вы можете прочитать здесь:

0
ответ дан 2 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: