【问题标题】:How do I swap the rows and different values in my function?如何交换函数中的行和不同的值?
【发布时间】:2020-04-17 17:04:59
【问题描述】:

我目前正在上编码课,我正在尝试学习 Python (Python 3),我已经在此处编写了一些代码用于作业,但我显然弄错了交换,我不知道如何解决它。我有作业的说明,并且我对我的代码有一个需要帮助理解的评论。有人可以告诉我如何通过交换不同的值来翻转行吗?

以下是说明:

这是我的代码:

def flipIt(array):
    for i in range(len(array)):
        length = len(array[i])
        for j in range(length // 2):
            temp = array[i][j]
            array[i][j] = array[i][length - 1 - j]
            array[i][length - 1 - j] = temp


pic = [['@', ' ', ' ', ' ', ' ', '@'],
       ['@', '@', ' ', ' ', ' ', '@'],
       ['@', ' ', '@', ' ', ' ', '@'],
       ['@', ' ', ' ', '@', ' ', '@'],
       ['@', ' ', ' ', ' ', '@', '@'],
       ['@', ' ', ' ', ' ', ' ', '@']]


flipIt(pic)
for i in pic:
    for j in i:
        print(j,end=' ')
    print()

这是评论:

我该怎么做?

【问题讨论】:

  • 以代码格式将代码添加为文本 - 人们倾向于对带有图像的问题投反对票以显示他们的代码
  • 嗨奥黛丽,请复制粘贴代码而不是截图。现在,如果有人想帮助您,他们将不得不手动复制您的代码。

标签: python arrays for-loop multidimensional-array 2d


【解决方案1】:

嗯,我花了一些时间才意识到这个问题,因为垂直和水平翻转这张图片会得到相同的结果。在您的情况下,您想要做的是:

def flipIt(array):
    height = len(array)
    for i in range(len(array) // 2):
        temp = array[i]
        array[i] = array[height-1-i]
        array[height-1-i] = temp
    # No need for return because it is modified in place

pic = [['@', ' ', ' ', ' ', ' ', '@'],
       ['@', '@', ' ', ' ', ' ', '@'],
       ['@', ' ', '@', ' ', ' ', '@'],
       ['@', ' ', ' ', '@', ' ', '@'],
       ['@', ' ', ' ', ' ', '@', '@'],
       ['@', ' ', ' ', ' ', ' ', '@']]


flipIt(pic)
for i in pic:
    for j in i:
        print(j,end=' ')
    print()

当然,正如 Sam Stafford 所建议的,您可以使用

使其更简单(假设您被允许)
def flipIt(array):
    array.reverse()

【讨论】:

    【解决方案2】:

    flipIt 函数是不需要的,因为 Python 有一个内置的方法来执行此操作。您需要做的就是替换:

    flipIt(pic)
    

    与:

    pic.reverse()
    

    (如果你想要一个额外的抽象层,或者因为分配要求你有一个专门称为flipIt的函数,你也可以做flipIt = lambda img: img.reverse()之类的事情。)

    list.reverse() 方法对任何列表进行操作,并对其元素进行就地反转。由于pic 是图像中的行列表,因此颠倒顺序具有垂直翻转的效果。

    您还可以通过使用 str.join() 将每一行转换为单个字符串来简化您的 print 循环。

    >>> pic = [['@', ' ', ' ', ' ', ' ', '@'],
    ...        ['@', '@', ' ', ' ', ' ', '@'],
    ...        ['@', ' ', '@', ' ', ' ', '@'],
    ...        ['@', ' ', ' ', '@', ' ', '@'],
    ...        ['@', ' ', ' ', ' ', '@', '@'],
    ...        ['@', ' ', ' ', ' ', ' ', '@']]
    >>> pic.reverse()  # flip the rows from top to bottom
    >>> for row in pic:
    ...     print(' '.join(row))
    ...
    @         @
    @       @ @
    @     @   @
    @   @     @
    @ @       @
    @         @
    

    【讨论】:

    • 我在上面的帖子中编辑了我的代码,我尝试了这个,但仍然得到错误的答案。还有其他方法可以做到这一点吗?
    • 将我运行代码的结果粘贴到这个答案中。它会产生您正在寻找的输出。
    【解决方案3】:

    您当前的代码实际上运行良好。你只是忘了从你的函数中返回你的翻转数组:

    def flipit(array):
        for i in range(len(array)):
            length = len(array[i])
            for j in range(length // 2):
                temp = array[i][j]
                array[i][j] = array[i][length - 1 - j]
                array[i][length -1 -j] = temp
        return array
    
    pic = [['@', ' ', ' ', ' ', ' ', '@'],
        ['@', '@', ' ', ' ', ' ', '@'],
        ['@', ' ', '@', ' ', ' ', '@'],
        ['@', ' ', ' ', '@', ' ', '@'],
        ['@', ' ', ' ', ' ', '@', '@'],
        ['@', ' ', ' ', ' ', ' ', '@']
       ]
    
    x = flipit(pic)
    
    print(x)
    

    【讨论】:

    • 我将上面帖子中的代码编辑为代码格式,我尝试了这个,但我弄错了。还有其他方法可以修复我的代码吗?
    • 你“弄错了”是什么意思?它改变了什么吗?它现在做什么?等等...请用任何可以帮助我们帮助您的新元素更新您的问题
    • 这给了我正确的答案:[['@', ' ', ' ', ' ', ' ', '@'], ['@', ' ', ' ', ' ', '@', '@'], ['@', ' ', ' ', '@', ' ', '@'], ['@', ' ', '@', ' ', '', '@'], ['@', '@', '', '', '', '@'], ['@', '', '', '', '', '@ ']] 您的代码是只为正确答案评分,还是在寻找“最佳”方法?
    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多