Как поменять местами строки и разные значения в моей функции? - PullRequest
0 голосов
/ 17 апреля 2020

Я сейчас нахожусь в классе кодирования, и я пытаюсь выучить Python (Python 3), и я написал здесь некоторый код для назначения, но я, очевидно, неправильно меняю местами, и я не знаю, как Исправить это. У меня есть инструкции по заданию, и у меня также есть комментарий к моему коду, который мне нужна помощь в понимании. Может кто-нибудь показать мне, как перевернуть строки, поменяв местами разные значения?

Вот инструкции:

enter image description here

Вот мой код:

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()

Вот комментарий:

enter image description here

Как мне сделать то, что говорится в комментарии?

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Ваш текущий код на самом деле работает просто отлично. Вы просто забыли вернуть свой перевернутый массив из вашей функции:

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)
0 голосов
/ 17 апреля 2020

Мм, мне потребовалось некоторое время, чтобы осознать проблему, потому что перелистывание этой картинки по вертикали и по горизонтали дает одинаковый результат. В вашем случае вы хотите:

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()

Конечно, как предложил Сэм Стаффорд, вы можете сделать это еще проще (учитывая, что вам разрешено) с помощью

def flipIt(array):
    array.reverse()
0 голосов
/ 17 апреля 2020

Функция flipIt не нужна, поскольку в Python есть встроенный способ сделать это. Все, что вам нужно сделать, это заменить:

flipIt(pic)

на:

pic.reverse()

(Вы также можете сделать что-то вроде flipIt = lambda img: img.reverse(), если вам нужен дополнительный слой абстракции или потому что назначение требовало, чтобы у вас была функция, которая была специально названа flipIt.)

Метод list.reverse() работает с любым списком и выполняет обратное изменение его элементов на месте. * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * Вы не можете упростить *1014*

. Вы также можете упростить print l oop, используя str.join(), чтобы повернуть каждый. строка в одну строку.

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