Мне нужно иметь возможность «вращать» список, который в форме «квадрата» выглядит как ромб python - PullRequest
0 голосов
/ 25 февраля 2020

Я создаю средство поиска слов и мне нужен способ поворота поиска слов, который находится в списке, поэтому левый угол - это «верх», а нижний правый - «низ»

У меня есть это:

 Puzzle = ["FUNCTIONRRIRAI",
              "RAIOONFRCCPWON",
              "PTCSNOBEUITOLO",
              "BNCACIANTOSLIH",
              "RBYOLILYNREFBT",
              "HYYNOGESTIBRIY",
              "AATTSIONCMCENP",
              "UORTENRRCBFVAU",
              "CEBEECVWIERORI",
              "PROCESSORTOPYF",
              "OHCOMPUTERHSOS",
              "YCYPRESREOSMRW",
              "OATHBRMVTHHCTR",
              "PGORWOOUIPSCHP"]

Мне это нужно для формирования:

Puzzle = ["F","RU","PAN","BTIC",...]

, поэтому кажется, что поиск слова был повернут на 45 градусов

любой Буду признателен за предложения / помощь

Код для поиска по горизонтали и слова для поиска:

def load_words_to_find(file_name):
    word_list = []
    file = open(file_name, "r")
    for line in file.readlines():
        word_list.append(line)
    word_list = list(map(lambda s: s.strip(), word_list))
    return word_list


def find_horizontal(Puzzle, Words, ReplaceWith, Found):
    # Parameters :- List:Puzzle, List:Words, Character:ReplaceWith, List:Found
    # Return :- List:Outpuz, List:Found
    # Find all words which are horizontally in place (left to right and right to left), return the puzzle and list of found words
    rev = ''
    Outpuz = Puzzle

    for line in Puzzle:
        rev = line[::-1]

        for word in Words:

            if word in line:
                Found.append(word)
                Puzzle[Puzzle.index(line)] = line.replace(word, ReplaceWith * len(word))
            if word in rev:
                Found.append(word)
                Puzzle[Puzzle.index(line)] = line.replace(word[::-1], ReplaceWith * len(word))
            else:
                pass

    print("Found: ", Found)
    print(Outpuz)

    return Outpuz, Found


find_horizontal(Puzzle, load_words_to_find("words.txt"), ".", [])

Ответы [ 4 ]

3 голосов
/ 25 февраля 2020

Глупо, но вы можете вставить итераторы строк в начало списка, а затем присоединиться и получить следующий символ из каждого итератора.

rows = [
    "FUNCTIONRRIRAI",
    "RAIOONFRCCPWON",
    "PTCSNOBEUITOLO",
    "BNCACIANTOSLIH",
    "RBYOLILYNREFBT",
    "HYYNOGESTIBRIY",
    "AATTSIONCMCENP",
    "UORTENRRCBFVAU",
    "CEBEECVWIERORI",
    "PROCESSORTOPYF",
    "OHCOMPUTERHSOS",
    "YCYPRESREOSMRW",
    "OATHBRMVTHHCTR",
    "PGORWOOUIPSCHP"
]

def get_next_diagonal(rows):

    iters = []
    for row in rows:
        iters.insert(0, iter(row))
        yield "".join(next(it, "") for it in iters)
    while iters[0].__length_hint__():
        yield "".join(next(it, "") for it in iters)

for diagonal in get_next_diagonal(rows):
    print(diagonal)

Вывод:

F
RU
PAN
BTIC
RNCOT
HBCSOI
AYYANNO
UAYOCOFN
COTNLIBRR
PERTOIAECR
ORBTSGLNUCI
YHOEEIEYTIPR
OCCCENOSNOTWA
PAYOECRNTRSOOI
GTPMSVRCIELLN
OHRPSWCMBFIO
RBEUOIBCRBH
WRSTREFEIT
OMRETRVNY
OVEROOAP
UTOHPRU
IHSSYI
PHMOF
SCRS
CTW
HR
P
2 голосов
/ 25 февраля 2020

Извините за недостаточную эффективность, но вот мое быстрое решение.

Мы рассматриваем сетку как набор координат. Это решение основано на том факте, что каждый элемент в выходных данных, которые вы хотите, будет иметь координаты X и Y, а не определенное число. Например, первый элемент «F» имеет местоположение (0,0), что равняется 0. Вторые два элемента «RU» расположены ad (1,0) и (0,1), которые оба складываются 1. Третья строка «PAN» содержит буквы, расположенные в точках (0,2), (1,1) и (2,0) и т. д. Отслеживая это число с помощью «i» в моем решении, оно должно быть достаточно большим для сканирования по всем спискам, так что это в два раза больше длины массива. Таким образом, мы сканируем список для элементов, которые расположены в координатах x и y, где x + y == i.

Код:

Puzzle = ["FUNCTIONRRIRAI",
      "RAIOONFRCCPWON",
      "PTCSNOBEUITOLO",
      "BNCACIANTOSLIH",
      "RBYOLILYNREFBT",
      "HYYNOGESTIBRIY",
      "AATTSIONCMCENP",
      "UORTENRRCBFVAU",
      "CEBEECVWIERORI",
      "PROCESSORTOPYF",
      "OHCOMPUTERHSOS",
      "YCYPRESREOSMRW",
      "OATHBRMVTHHCTR",
      "PGORWOOUIPSCHP"]

output = []
i = 0
while i < len(Puzzle)*2:
    single_string = ""
    for y in range(0,len(Puzzle)):
        for x in range(0,len(Puzzle[0])):
            if (x + y) == i:
                single_string += Puzzle[x][y]
    if single_string != "":
        output.append(single_string)
    i += 1

print(output)

Выходы

['F',
 'RU',
 'PAN',
 'BTIC',
 'RNCOT',
 'HBCSOI',
 'AYYANNO',
 'UAYOCOFN',
 'COTNLIBRR',
 'PERTOIAECR',
 'ORBTSGLNUCI',
 'YHOEEIEYTIPR',
 'OCCCENOSNOTWA',
 'PAYOECRNTRSOOI',
 'GTPMSVRCIELLN',
 'OHRPSWCMBFIO',
 'RBEUOIBCRBH',
 'WRSTREFEIT',
 'OMRETRVNY',
 'OVEROOAP',
 'UTOHPRU',
 'IHSSYI',
 'PHMOF',
 'SCRS',
 'CTW',
 'HR',
 'P']

Надеюсь это поможет. С удовольствием, чтобы уточнить что-либо, если это необходимо

0 голосов
/ 26 февраля 2020

Мне проще и понятнее просто сгенерировать индексы в два цикла: по строкам, начинающимся с первого столбца, а затем по столбцам, начинающимся с последней строки:

puzzle = ['FUNCTIONRRIRAI',
 'RAIOONFRCCPWON',
 'PTCSNOBEUITOLO',
 'BNCACIANTOSLIH',
 'RBYOLILYNREFBT',
 'HYYNOGESTIBRIY',
 'AATTSIONCMCENP',
 'UORTENRRCBFVAU',
 'CEBEECVWIERORI',
 'PROCESSORTOPYF',
 'OHCOMPUTERHSOS',
 'YCYPRESREOSMRW',
 'OATHBRMVTHHCTR',
 'PGORWOOUIPSCHP']

nrows = len(puzzle)
ncols = len(puzzle[0])
output = []
for ir in range(nrows):
    row = []
    ic = 0
    jr = ir
    while jr >= 0:
        row.append(puzzle[jr][ic])   
        ic += 1
        jr -= 1
    output.append(''.join(row))
for ic in range(1, ncols):
    row = []
    ir = nrows - 1
    jc = ic
    while jc < ncols:
        row.append(puzzle[ir][jc])
        ir -= 1
        jc += 1
    output.append(''.join(row))

for row in output:
    print(row)

Вывод:

F
RU
PAN
BTIC
RNCOT
HBCSOI
AYYANNO
UAYOCOFN
COTNLIBRR
PERTOIAECR
ORBTSGLNUCI
YHOEEIEYTIPR
OCCCENOSNOTWA
PAYOECRNTRSOOI
GTPMSVRCIELLN
OHRPSWCMBFIO
RBEUOIBCRBH
WRSTREFEIT
OMRETRVNY
OVEROOAP
UTOHPRU
IHSSYI
PHMOF
SCRS
CTW
HR
P
0 голосов
/ 26 февраля 2020

Вариация темы - создание диагональных индексов.
Если вы проведете пальцем по левому краю, это отправная точка для диагоналей top-half и отслеживания пальца по нижнему краю являются начальными точками для нижней половины диагоналей.

Верхняя половина:
От начальной точки каждой диагонали индексы первого измерения находятся в диапазоне от начальной точки до нуля (отрицательные шаги) и индексы второго измерения находятся в диапазоне от нуля до максимальной длины второго измерения (положительные шаги).

Нижняя половина:
От начальной точки каждой диагонали индексы первого измерения варьируются от длины первого измерения от минус один до минимума ноль (отрицательные шаги), и индексы второго измерения варьируются от начальной точки до длины второго измерения (положительные шаги).

Для обоих наборов диагоналей вы можете воспользоваться тем фактом, что zip остановит остановку , когда самая короткая итерация исчерпана.

def cw(dims,ragged=False):
    '''Generate indices for diagonals based on dims.

       dims --> tuple: (nrows,ncolumns)

       Currently only implemented for all rows have same number of columns
       Diagonals as if the rectangle was rotated CW 45 degrees
       bottom-left to upper-right
    '''
    if ragged: raise NotImplementedError
    nrows,ncolumns = dims
    # top half
    index1 = range(0,ncolumns)
    for i in range(nrows):
        yield zip(range(i,-1,-1),index1)
    # bottom half
    index0 = range(nrows-1,-1,-1)
    for i in range(1,nrows):
        yield zip(index0,range(i,ncolumns))

new = []    
for diagonal in cw((len(Puzzle),len(Puzzle[0]))):
    new.append(''.join(Puzzle[j][k] for (j,k) in diagonal))

И решение для вращения против часовой стрелки

def ccw(dims,ragged=False):
    '''Generate indices for diagonals based on dims.

       dims --> tuple: (nrows,ncolumns)

       Currently only implemented for all rows have same number of columns
       Diagonals as if the rectangle was rotated CCW 45 degrees
            top-left to bottom-right
    '''
    if ragged: raise NotImplementedError
    nrows,ncolumns = dims
    # top half
    index0 = range(0,nrows)
    for i in range(ncolumns,-1,-1):
        yield zip(index0,range(i,ncolumns))
    # bottom half
    index1 = range(0,ncolumns)
    for i in range(1,nrows):
        yield zip(range(i,nrows),index1,)
...