如何比较带有两个条件的两个列表?

3

我想要做的具体事情

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循环来实现:

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个回答

5

可以使用一行的列表推导式和三元比较来完成:

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

那会生成列表而不是字符串吗? - Peter Wood
一个字符串就是一个列表。另外,@Jondiedoop,你可以使用 not str.isalpha() 来确定它是否为符号。 - Jab
谢谢你的提示Jaba,我已经编辑好了。顺便说一下,我添加了"".join(),所以它实际上是一个字符串。 - Jondiedoop
处理具有对应值的列表时,zip 应该是首先想到的东西。+1 - Ahmad Khan
@Jaba,str不是list - Peter Wood
你是正确的,虽然在大多数情况下,字符串可以以类似的方式处理。感谢您纠正我。 - Jab

1
这段代码应该可以满足你的需求。
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
我们可以这样写:
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_listnormal_list的行。对于每一行,我们再迭代这两行,并使用casymbol_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

我更注重可读性而非长度。

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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接