优化此合并排序功能的任何想法?
输入是这样的列表:[[(1,'i'),(3,'i'),(5,'i'),(8,'i')],[(2, 'n')],[(4,'t'),(7,'t')],[(6,'a')],[(9,'v')],[(10,'e ')]],输出是单词:“initiative”
def merge(decks):
while len(decks) > 1:
del1 = decks.pop(0)
del2 = decks.pop(0)
total = list()
while (len(del1) and len(del2)) > 0:
if del1[0] < del2[0]:
total.append(del1.pop(0))
else:
total.append(del2.pop(0))
total.extend(del1)
total.extend(del2)
decks.append(total)
word = ""
for kort in decks[0]:
word += kort[1]
return word
答案 0 :(得分:0)
我可以想到一个优化:在内循环之前反转del[1]
和list.pop(0)
并将list.pop()
(an O(n) operation)更改为{{1 (在O(1)中)。反转也是O(n),但由于你在循环中进行pop(0)
,它实际上是O(n^2)
。
答案 1 :(得分:0)
更简单的是简单地展平列表,然后自然地对元组进行排序。
example.com/css-loader
from itertools import chain, imap
from operator import itemgetter
def merge(decks):
return "".join(imap(itemgetter(1),
sorted(chain.from_iterable(decks)))
展平嵌套列表from_iterable
通过每个元组的整数第一个元素自然地对扁平序列中的元组进行排序sorted
是itemgetter(1)
lambda x: x[1]
将访问权限应用于imap
返回的列表,提取字母sorted
根据提取的字母略少&#34;功能性&#34;风格将是使用列表理解,这是有道理的,因为"".join
无论如何都返回一个列表,而不是更通用的迭代器。
sorted
您还可以使用def merge(decks):
return "".join(x[1]
for x in sorted(chain.from_iterable(decks)))
模块的heapq
函数,该函数利用每个嵌套列表已经排序的事实,而不是简单地对展平列表进行排序。
merge