Как сравнить два списка с двумя условиями? - PullRequest
0 голосов
/ 04 ноября 2018

Что я конкретно пытаюсь сделать

symbol_list = ["....firstline.\\.||hi",
               "pythonisasnake..\....",
               "||||last.\\|line\\..."]

normal_list = ["ABCDfirstlineEFGHIJhi",
               "pythonisasnakeKLMNOPQ",
               "RSTUlastVWXYlineZABCD"]

В symbol_list я хочу заменить символы буквой в соответствующей позиции в normal_list, а я хочу заменить не-символы в списке на *

  • Символы всегда будут . \ |

Ожидаемый результат:

new_list = ["ABCD*********EFGHIJ**",
            "**************KLMNOPQ",
            "RSTU****VWXY****ZABCD"]

Какое решение для этого?

Что я пытался сделать

Для обоих списков мне как-то нужно было получить доступ к каждому элементу в каждой строке, что казалось действительно сложным для выполнения. Я пытался начать это с петли для:

for symbol_row in symbol_list:
    for symbol_item in symbol_row:
        for normal_row in normal_list:
            for normal_item in normal_row:

Это сбивало с толку, и кажется, что рекомендуется делать не более двух

Затем я попытался проверить одно из условий:

if symbol_item in (".","\\","|"): # because \ is an escape character
    symbol_row = symbol_row.replace(symbol_item, normal_item)

Затем я добавил эту новую строку в new_list, но мой список оказался в 10 раз длиннее, чем был до того, как я его распечатал

new_list.append(symbol_row)

Ответы [ 4 ]

0 голосов
/ 04 ноября 2018

Я предпочитаю удобочитаемость по длине,

symbol_list = ["....firstline.\\.||hi",
               "pythonisasnake..\....",
               "||||last.\\|line\\..."]

normal_list = ["ABCDfirstlineEFGHIJhi",
               "pythonisasnakeKLMNOPQ",
               "RSTUlastVWXYlineZABCD"]



final_list = list()
for nor, sym in zip(normal_list, symbol_list):
    temp_string = ""
    for n, s in zip(nor, sym):
        if s.isalpha():
            temp_string += '*'
        else:
            temp_string += n
    final_list.append(temp_string)

print(final_list)

# output,
['ABCD*********EFGHI**', '**************KLMNOPQ', 'RSTU****VWX****eZAB']
0 голосов
/ 04 ноября 2018

Мы можем написать это как:

my_symbols = {'\\', '|', '.'}

[
  ''.join(('*', cb)[ca in my_symbols] for ca, cb in zip(linea, lineb))
  for linea, lineb in zip(symbol_list, normal_list)
]

здесь мы, таким образом, сначала определяем набор символов (чтобы его было легко расширить). Затем мы одновременно перебираем строки symbol_list и normal_list. Для каждой строки мы затем выполняем итерацию по двум строкам и используем ca (символ строки symbol_list) в качестве селектора, чтобы определить, заполним ли мы '*' или cb для этого конкретного символа.

Вывод для вашего образца ввода:

>>> [
...   ''.join(('*', cb)[ca in my_symbols] for ca, cb in zip(linea, lineb))
...   for linea, lineb in zip(symbol_list, normal_list)
... ]
['ABCD*********EFGHI**', '**************KLMNOPQ', 'RSTU****VWX****eZAB']

В вашем вводном примере в последней строке есть немного "смещения", поскольку оно содержит:

||||last.\|line\...
RSTUlastVWXYlineZABCD

поэтому ваша последняя строка содержит:

||||last.\|line\...
RSTUlastVWXYlineZABCD
---------------------
RSTU****VWXY***eZAB
0 голосов
/ 04 ноября 2018

Этот код должен делать то, что вам нужно.

symbol_list = ["....firstline.\\.||hi",
               "pythonisasnake..\....",
               "||||last.\\|line\\..."]

normal_list = ["ABCDfirstlineEFGHIJhi",
               "pythonisasnakeKLMNOPQ",
               "RSTUlastVWXYlineZABCD"]

letters = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"

new_list = []

for i in range(len(symbol_list)):
    new_list.append("")
    for index in range(len(symbol_list[i])):
        if letters.find(symbol_list[i][index]) != -1:
            new_list[i] += "*"
        else:
            new_list[i] += normal_list[i][index]

print(new_list)
input()

Находит все экземпляры букв в списке символов и ставит звездочку в новый список

0 голосов
/ 04 ноября 2018

Это можно сделать с помощью понимания линии и троичного сравнения:

symbol_list = ["....firstline.\\.||hi",
               "pythonisasnake..\....",
               "||||last.\\|line\\..."]

normal_list = ["ABCDfirstlineEFGHIJhi",
               "pythonisasnakeKLMNOPQ",
               "RSTUlastVWXYlineZABCD"]

print([''.join([n if not s.isalpha() else '*' for n,s in zip(nor, sym)])
                    for nor, sym in zip(normal_list, symbol_list)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...