按符号筛选列表元素

2024-10-02 06:26:25 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想把有/没有-.的元素过滤成两个列表。我的代码不能完成这项工作,它似乎每件事都要运行两次,而且不能同时替换-.。我哪里做错了?你知道吗

代码:

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

Tags: no代码inorgcomforwithspace
3条回答

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

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

因此,对于每个SPACEWITH_SYMBOL,或者对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()调用不同,您还可以使用translation table passed to ^{};如果要替换的字符数可变,则这会更快,而且更灵活。对于后一种情况,可以使用^{} 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)

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

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

您不需要在同一列表上运行两次循环,而是可以修改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)

相关问题 更多 >

    热门问题