首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们如何使这个Python合并排序实现更加Pythonic?

我们如何使这个Python合并排序实现更加Pythonic?
EN

Code Review用户
提问于 2014-05-10 10:10:04
回答 1查看 1.9K关注 0票数 4

我在Python中实现了合并排序算法的(版本)。我的目标是双重的:

  1. 以语言无关的方式提高对合并、排序和递归的理解。
  2. 提高对Python惯例和习惯用法的理解。

该实现递归地将给定序列拆分为左序列和右序列,然后将这两个子序列合并回按升序排序的子序列。

欢迎所有改进建议。我特别希望得到以下方面的反馈:

  • 循环遍历序列的总长度和未使用的变量。
  • 尝试的使用-除了块。
  • 使用索引和切片。
代码语言:javascript
复制
class MergeSort(object):

def sort(self, seq):
    '''
    Sorts a sequence of integers.

    @param seq: an unsorted tuple or list.
    @return:    a new tuple with elements in @seq sorted in ascending order. 
    '''
    if(len(seq) <= 1):
        return seq
    else:
        return self._merge(leftSortedSeq=self.sort(seq[0:(len(seq) / 2)]), 
                           rightSortedSeq=self.sort(seq[(len(seq) / 2):]))

def _merge(self, leftSortedSeq, rightSortedSeq):
    if(len(leftSortedSeq) == 0):
        return rightSortedSeq
    elif(len(rightSortedSeq) == 0):
        return leftSortedSeq

    leftPointer = 0
    rightPointer = 0
    mergedSeq = []
    mergedSeqLength = len(leftSortedSeq) + len(rightSortedSeq)
    for elementNumber in range(mergedSeqLength):

        try:
            smallestInLeft = leftSortedSeq[leftPointer]
        except IndexError:
            mergedSeq += rightSortedSeq[rightPointer:]
            return tuple(mergedSeq)

        try:
            smallestInRight = rightSortedSeq[rightPointer]
        except IndexError:
            mergedSeq += leftSortedSeq[leftPointer:]
            return tuple(mergedSeq)

        if(smallestInLeft < smallestInRight):
            mergedSeq.append(leftSortedSeq[leftPointer])
            leftPointer += 1
        else:
            mergedSeq.append(rightSortedSeq[rightPointer])
            rightPointer += 1

    return tuple(mergedSeq)
EN

回答 1

Code Review用户

发布于 2014-05-10 14:27:44

如果您有像下面这样的表达式

代码语言:javascript
复制
if(x == 0) 

然后你可以把它重写为

代码语言:javascript
复制
if not x

你可以去掉括号,这样写就能使它变得更像奏鸣曲。

同样,你也是一个重写者:

代码语言:javascript
复制
if(len(leftSortedSeq) == 0):
    return rightSortedSeq
elif(len(rightSortedSeq) == 0):
    return leftSortedSeq

作为

代码语言:javascript
复制
if not len(leftSortedSeq):
    return rightSortedSeq
elif not len(rightSortedSeq):
    return leftSortedSeq

如果我是你,我将避免使用多余的情况,这是可以避免使用简单的,如果其他。这将使代码更加清晰。

我们可以通过稍微修改代码来避免异常。

我也避免了转换成元组。元组和列表的连接可能会导致问题。所以最好避免不必要的转换。

代码语言:javascript
复制
lenLeftSeq = len(leftSortedSeq)
lenRightSeq = len(rightSortedSeq)

while leftPointer < lenLeftSeq and rightPointer < lenRightSeq:

    smallestInLeft = leftSortedSeq[leftPointer]
    smallestInRight = rightSortedSeq[rightPointer]

    if(smallestInLeft < smallestInRight):
        mergedSeq.append(smallestInLeft)
        leftPointer += 1
    else:
        mergedSeq.append(smallestInRight)
        rightPointer += 1

return mergedSeq +
             leftSortedSeq[leftPointer:] +
             rightSortedSeq[rightPointer:]
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/49395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档