Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中存在的字符串中删除所有单词_Python_Pandas - Fatal编程技术网

Python 从列表中存在的字符串中删除所有单词

Python 从列表中存在的字符串中删除所有单词,python,pandas,Python,Pandas,社区 我需要编写一个函数,遍历一个字符串并检查每个单词是否存在于列表中,如果单词存在于(删除列表)中,它应该删除该单词,如果不单独保留它的话 我写道: def remove_make(x): a = x.split() for word in a: if word in remove: # True a = a.remove(word) else: pass return a

社区

我需要编写一个函数,遍历一个字符串并检查每个单词是否存在于列表中,如果单词存在于(删除列表)中,它应该删除该单词,如果不单独保留它的话

我写道:

def remove_make(x):
    a = x.split()
    for word in a: 
        if word in remove: # True
            a = a.remove(word)  
        else:
            pass
        return a

但它返回的字符串中仍有(Remove)单词。你知道我如何做到这一点吗?

更简洁的方法是根据要删除的单词列表形成一个正则表达式替换,然后进行单个正则表达式替换:

inp=“一二三四”
删除=['2','4']
regex=r'\s*(?:'+r'|'.连接(删除)+')\s*'
out=re.sub(regex',inp.strip()
打印(输出)#打印“一三”
列表。删除(x)
返回
None
,并通过删除列表中存在的
x
来修改列表。当你这样做的时候

a = a.remove(word)
您将在
a
中有效地存储
None
,这将在下一次迭代中,当您再次执行
a.remove(word)
None.remove(word)
无效)时出现异常,但您也无法获得该异常,因为在条件语句之后立即返回
(这是错误的,在循环完成后,您需要在其范围之外返回
)。这是您的函数应该是这样的(在迭代时不修改列表):


您可以创建一个没有要删除的单词的新列表,然后使用join()函数连接该列表中的所有单词。请重试

def remove_words(string, rmlist):
    final_list = []
    word_list = string.split()
    for word in word_list:
        if word not in rmlist:
            final_list.append(word)
    
    return ' '.join(final_list)

您可以尝试更简单的方法:

import re

remove_list = ['abc', 'cde', 'edf']
string = 'abc is walking with cde, wishing good luck to edf.'

''.join([x for x in re.split(r'(\W+)', string) if x not in remove_list])
结果是:

“正和你同行,祝你好运。”

重要的部分是最后一行:

''.join([x for x in re.split(r'(\W+)', string) if x not in remove_list])
它的作用是:

  • 您正在将字符串转换为带有(r'(\W+)、字符串的单词列表,并将所有空格和标点符号保留为列表项
  • 您正在使用创建另一个列表,筛选所有不在删除列表中的项目
  • 您正在使用将结果列表转换回字符串
可以找到用于列表理解的BNF符号以及关于它们的更多信息


PS:当然,如果您将一行程序分解为和平,并分配re.split(r'(\W+),string)的结果,您可能会使其更具可读性添加一个变量,并将联接和理解解耦。

您需要保留一份列表副本并对其进行迭代,除了您请求的答案结构和您尝试过的代码之外,您能否共享文件中的简单数据?对于我来说,您的问题不清楚。由于缺乏解释,您需要添加更多信息。字符串的简单数据以及您正在寻找的所需答案。请小心使用变量
remove
,因为它不是函数的参数,也不是init定义的。拆分也会带来一些麻烦。如果拆分“I like you”。如果要删除“you”,您将得到
a=['I','like','you.]
,这将失败。没有提到标点符号,我甚至不知道如何从列表中创建字符串(他们甚至不返回字符串,但列表本身顺便说一句),这个答案只是为了解决当前的问题,而不是关于如何从拆分列表中创建一个正确、合理的列表。如果我要删除这些单词,我会使用正则表达式或列表理解,我可以在答案中提到,但这不是真正的问题。我认为这个问题需要更多的细节你说得对。但我认为重要的是,标点符号会对结果产生影响。
''.join([x for x in re.split(r'(\W+)', string) if x not in remove_list])