嗨,我想将带有/不带有-
,.
的元素过滤到两个列表中。我的代码无法完成工作,似乎所有内容都运行了两次,并且无法同时替换-
和.
。我在哪里做错了?
代码:
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']
答案 0 :(得分:2)
通过使用for
循环,您正在分别对待这两个字符:
for ch in ['-', '.']:
循环,将ch
设置为'-'
。在i
中找到该字符后,您将创建一个删除了-
的新字符串,并将其附加到SPACE
上,并且i
本身将附加到WITH_SYMBOL
上。如果找不到该字符,则将其附加到NO_SYMBOL
。ch
设置为'.'
,您将再次执行所有相同的工作。因此,对于每个SPACE
,您总是附加到WITH_SYMBOL
和NO_SYMBOL
,或者附加到i
两次。
您需要延迟追加,直到处理完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()
呼叫外,您还可以使用translation table passed to str.translate()
;如果您要替换的字符数不固定,这将更快,更灵活。对于后一种情况,您可以使用any()
function测试字符序列:
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)
答案 1 :(得分:0)
您不需要循环就可以在同一列表上运行两次,而是可以修改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)
答案 2 :(得分:0)
我认为您的代码中的错误是由其他答案找到的-但是通过使用简单的RegEx,您将获得更高的性能,并且在必须添加新符号以进行匹配时可以轻松地对其进行更改:
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)
在线演示here