【问题标题】:2048 Merge Function2048合并功能
【发布时间】:2015-09-04 10:46:54
【问题描述】:

2048 合并函数

来自:Coursera 上的计算原理第 1 部分课程

我在我的 OWLTEST 上获得了-2 pts,它使用 Pylint 作为样式指南。错误状态:

分支过多 (17/12) 函数“合并”,第 7 行

这是什么意思?

我非常努力地完成了这个程序。我从头开始写这个。我还想知道是否有一些技术可以使这种更清洁和/或一些最佳实践改进?我知道可能有更好的方法来写这个,因为现在我的代码看起来很乱。

  # -*- coding: utf-8 -*-
    """
    Created on Thu Sep  3 17:55:56 2015
    2048_merge_attempt1.py
    @author: Rafeh
    """
    def merge(nums):
        '''
        Takes a list as input 
        returns merged pairs with
        non zero values shifted to the left.
        [2, 0, 2, 4] should return [4, 4, 0, 0]
        [0, 0, 2, 2] should return [4, 0, 0, 0]
        [2, 2, 0, 0] should return [4, 0, 0, 0]
        [2, 2, 2, 2, 2] should return [4, 4, 2, 0, 0]
        [8, 16, 16, 8] should return [8, 32, 8, 0]
        '''
        slide = []  # Append non-zeroes first
        for num in nums:
            if num != 0:
                slide.append(num)
        for num in nums:
            if num == 0:
                slide.append(num)
        pairs = []
        for idx, num in enumerate(slide):
            if idx == len(slide)-1:
                pairs.append(num)
                if len(pairs) != len(nums):
                    pairs.append(0)
                break
            if num == slide[idx+1]:
                if num != 0:
                    pairs.append(num*2)
                    slide[idx+1] -= slide[idx+1]
                    # slide[idx+1], slide[idx+2] = slide[idx+2], slide[idx+1]
                else:
                    pairs.append(num)
            else:
                    pairs.append(num)  # Even if they don't match you must append
        slide = []  # Append non-zeroes first
        for num in pairs:
            if num != 0:
                slide.append(num)
        for num in nums:
            if num == 0:
                slide.append(num)
        for _ in range(len(nums) - len(slide)):
            if len(nums) != len(slide):
                slide.append(0)
        return slide

【问题讨论】:

标签: python merge coding-style pylint pep8


【解决方案1】:

“分支”是程序控制流中的一个位置,其中控件可能以多种方式“分支”,即执行一组不同的语句。一个很好的例子是一个“if”语句,它总是有两个分支。例如

a()
if e:
  b()
c()

如果忽略异常或sys.exit() 调用等的可能性,则有两个分支:a(); b(); c() 以防e 为真。或者 a(); c(); 以防 e 为假。

在您的情况下,有很多 if 语句可以替换。例如,而不是

for num in nums:
    if num != 0:
        slide.append(num)

你可以写

slide += [num in nums if num != 0]

现在,这个循环在各处重复。所以我建议只做一次,在顶部,然后有

nonZeroNums = [num in nums if num != 0]

然后使用它。

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 2015-02-10
    • 2014-11-22
    • 2010-11-04
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多