Нет - это не имеет значения в малейшем. На 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.
Стандартная библиотека Python предлагает способ для этого: heapq.merge
.
Как сказано в документации, это очень похоже на использование itertools (но с большим количеством ограничений); если вы не можете жить с этими ограничениями (или если вы не используете Python 2.6), вы можете сделать что-то вроде этого:
sorted(itertools.chain(args), cmp)
Однако я думаю, что оно имеет ту же сложность, что и ваше собственное решение, хотя использование итераторов должно дать неплохую оптимизацию и увеличение скорости.
Мне нравится ответ Роберто Лиффредо. Я не знал о 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
Я не знаю, будет ли это быстрее, но вы можете упростить это с помощью:
def GetObjKey(a):
return a.points
return sorted(a + b + c, key=GetObjKey)
Вы также, конечно, можете использовать cmp
вместо , если хотите, нажмите
.
Используйте модуль bisect
. Из документации: «Этот модуль поддерживает поддержание списка в отсортированном порядке без необходимости сортировать список после каждой вставки».
import bisect
def magic(*args):
r = []
for a in args:
for i in a:
bisect.insort(r, i)
return r
Вместо использования списка вы можете использовать [куча] ( http://en.wikipedia.org/wiki/Heap_ (data_structure) .
Это вставка O (log (n)), поэтому слияние a, b и c будет O (n log (n))
В Python вы можете использовать модуль heapq
.
Вот и все: полностью функционирующая сортировка слиянием для списков (адаптированная из моей сортировки здесь ):
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
в виде строки Однострочное решение с использованием сортировки:
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)
Я задал аналогичный вопрос и получил отличные ответы:
Лучшее решение этого вопроса - это варианты алгоритма слияния, о которых вы можете прочитать здесь: