【问题标题】:Code does not work if I replace something with a variable, containing the same content如果我用包含相同内容的变量替换某些内容,代码将不起作用
【发布时间】:2019-12-26 14:14:55
【问题描述】:

我正在执行以下任务:给定一个大小为 m x n 的 2D 网格和一个整数 k。您需要将网格移动 k 次。

所以想出了以下代码,它工作得很好:

"""
:type grid: List[List[int]]
:type k: int
:rtype: List[List[int]]
"""
class Solution(object):
    def shiftGrid(self, grid, k):
        #convert grid into 1D list conv
        conv = sum(grid, [])
        
        #pre-calculating length of list to save runtime
        length = len(conv)
        
        #pre-calculating last element of list to save runtime
        last = length-1
        
        # calculate the number of grids so we can separate them again later
        grid_counter = length/len(grid)
        
        #k-times: insert last item from list conv to beginning and than delete the last item
        for i in range(k):
            conv.insert(0, conv[(len(conv)-1)])
            del conv[len(conv)-1]
            
        #reconvert 1D list conv to a 2D list and return it
        return [conv[i:i+grid_counter] for i in xrange(0, len(conv), grid_counter)]

如您所见,for 循环使用len(conv)-1 运行,我想替换它以节省运行时间。所以我在上面预先计算了它。 但是,一旦我用last 替换len(conv)-1,代码就不再起作用,因为它给出了错误的输出。所以我退后一步,只用length 替换了len(conv),但问题仍然存在。即使我在 for 循环中预先计算 lastlength 也不起作用。

我有什么遗漏或做错了吗?

【问题讨论】:

    标签: python python-2.7 for-loop replace


    【解决方案1】:
    conv.insert(0, conv[(len(conv)-1)])
    del conv[len(conv)-1]
    

    在第二行中,您将在插入后立即删除。因为你刚刚在上一行添加了一个元素,所以删除行中的len(conv)-1last是不一样的;这将是一个。您必须将变量放在这些行之间才能执行您想要执行的操作。

    我会注意到,你有这样的评论:

    #pre-callculating last element of list to save runtime
    

    计算len(conv)-1 非常快。 len 是 O(1);运行时不依赖于列表的长度。出于性能原因,我不会在这里使用变量。我预计基本上没有收益。

    【讨论】:

    • 嗯,好的,非常感谢它的工作。我还有什么可以更改我的代码以节省运行时间的吗?
    • @szoeke sum(grid, []) 需要创建一些临时列表。在grid 上循环调用extend 可能会更快。调用insert(0, 也非常慢。插入到列表的前面需要首先将所有其他元素向下移动以在数组中腾出空间。如果你需要前插,import dequeue,然后appendleft就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多