按符号过滤列表元素

时间:2018-08-25 08:22:52

标签: python list

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

代码:

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

3 个答案:

答案 0 :(得分:2)

通过使用for循环,您正在分别对待这两个字符:

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

因此,对于每个SPACE,您总是附加到WITH_SYMBOLNO_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