按符号过滤列表元素



嗨,我想过滤带有/不带-的元素,.为两个列表。我的代码没有完成这项工作,它似乎运行了两次所有内容,并且无法同时替换-.。我哪里做错了?

法典:

NO_SYMBOL = []
WITH_SYMBOL = []
SPACE = []
for i in DATA:
for ch in ['-', '.']:
if ch in i:
WITH_SYMBOL.append(i)
SPACE.append(i.replace(ch, ' '))
else:
NO_SYMBOL.append(i)

数据

['volunteer-abroad',
'volunteer-abroad.com',
'volunteer-abroad.ie',
'volunteer-abroad.org',
'volunteerabroad']

我的输出:

SPACE
['volunteer abroad',
'volunteer abroad.com',
'volunteer abroad.ie',
'volunteer abroad.org',
'volunteer-abroad com',
'volunteer-abroad ie',
'volunteer-abroad org']
NO_SYMBOL
['volunteer-abroad', 'volunteerabroad', 'volunteerabroad']

我想获得这样的输出:

SPACE
['volunteer abroad',
'volunteer abroad com',
'volunteer abroad ie',
'volunteer abroad org']
NO_SYMBOL
['volunteerabroad']

通过使用for循环分别处理这两个字符:

  • 第一次通过for ch in ['-', '.']:循环时,ch设置为'-'。当在i中找到该字符时,您将创建一个删除-的新字符串,并将其附加到SPACEi本身将附加到WITH_SYMBOL。如果未找到该字符,则追加到NO_SYMBOL
  • 第二次通过循环时,ch设置为'.',然后您再次执行所有相同的工作。

因此,您始终附加到SPACEWITH_SYMBOL,或者为每个i追加两次NO_SYMBOL

您需要延迟追加,直到您处理完ch中的所有字符,并且只有在循环完成后才能决定追加的位置。你可以为此使用标志变量:

for i in data:
altered = False
cleaned = i
for ch in ['-', '.']:
if ch in clean:
altered = True
cleaned = cleaned.replace(ch, ' ')
if altered:
SPACE.append(cleaned)
WITH_SYMBOL.append(i)
else:
NO_SYMBOL.append(i)

您也可以只测试任一字符是否存在,并对这两个字符使用str.replace()。这样做是安全的,str.replace()根本不在乎您要替换的角色是否根本不存在:

if '-' in i or '.' in i:
SPACE.append(i.replace('-', ' ').replace('.', ' '))
WITH_SYMBOL.append(i)
else:
NO_SYMBOL.append(i)

与其使用两个.replace()调用,不如使用传递给str.translate()转换表;如果你有可变数量的字符要替换,这会更快,更灵活。对于后一种情况,您可以使用any()函数来测试字符序列:

symbols = ['-', '.']  # can be extended later
translation_map = str.maketrans(dict.fromkeys(symbols, ' '))  # map any symbol to a space
for entry in data:    # entry is a nicer name here than i
# the following loops over symbols until one is found that matches, then 
# returns True. If no matching symbol is found, False is given instead.
if any(ch in entry for ch in symbols):
SPACE.append(entry.translate(translation_map))
WITH_SYMBOL.append(entry)
else:
NO_SYMBOL.append(entry)

你不需要循环在同一列表中运行两次,而是可以修改 if 条件

NO_SYMBOL = []
WITH_SYMBOL = []
SPACE = []
for i in DATA:
if '-' in i or '.' in i:
WITH_SYMBOL.append(i)
SPACE.append(i.replace('.', ' ').replace('-', ' '))
else:
NO_SYMBOL.append(i)

我认为您的代码中的错误是由其他答案发现的 - 但是通过使用简单的正则表达式,您将获得更高的性能,并且在您必须添加新符号以匹配时可以轻松更改它:

import re
pattern = re.compile("[-.]")
NO_SYMBOL = []
WITH_SYMBOL = []
SPACE = []
for item in data:
if pattern.search(item):
WITH_SYMBOL.append(item)
SPACE.append(pattern.sub(" ", item))
else:
NO_SYMBOL.append(item)

在线演示在这里

最新更新