在python中优化合并排序函数

时间:2017-08-29 18:22:55

标签: python

优化此合并排序功能的任何想法?

输入是这样的列表:[[(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

2 个答案:

答案 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通过每个元组的整数第一个元素自然地对扁平序列中的元组进行排序
  • sorteditemgetter(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