如何清除列表中的一些字符串?
How to clean some some strings in the list?
当字符串以“@”、“#”、"http" 或 "rt" 开头或包含这些字符串时,我试图从列表中删除一些字符串。下面是示例列表。
text_words1 = ['@football', 'haberci', '#sorumlubenim', 'dedigin', 'tarafsiz', 'olurrt', '@football', 'saysaniz', 'olur', '#sorumlubenim', 'korkakligin', 'sonu']
根据上面的列表,我想删除“@football”和“#sorumlubenim”。我尝试了下面的代码。
i = 0
while i < len(text_words1):
if text_words1[i].startswith('@'):
del text_words1[i]
if text_words1[i].startswith('#'):
del text_words1[i]
i = i+1
print 'The updated list is: \n', text_words1
但是,上面的代码只删除了一些字符串,并没有删除所有以“@”或“#”符号开头的字符串。
然后,我将下面的代码添加到上面的代码中,因为并非所有感兴趣的字符串都以“@”、“#”或 "http" 开头,但包含这些符号。
while i < len(text_words1):
if text_words1[i].__contains__('@'):
del text_words1[i]
if text_words1[i].__contains__('#'):
del text_words1[i]
if text_words1[i].__contains__('http'):
del text_words1[i]
i = i+1
print 'The updated list: \n', text_words1
以上代码删除了一些包含“#:”或“@”但不是全部的项目。
有人可以告诉我如何删除所有以“@”、“#”、"http" 或 "rt" 开头或包含的项目吗?
正如评论所指出的那样。使用您的方法,您将失去对列表索引的引用,因此不会迭代整个列表。您可以使用列表理解来删除不需要的词
new_list = [i for i in text_words1 if not i.startswith(('@','#'))]
这是我的解决方案:
import re
text_words1 = ['@football', 'haberci', '#sorumlubenim', 'dedigin', 'tarafsiz', 'olurrt', '@football', 'saysaniz', 'olur', '#sorumlubenim', 'korkakligin', 'sonu']
for i, word in reversed(list(enumerate(text_words1))):
if re.search('(@|#|http|rt)', word):
del text_words1[i]
有了列表理解:
text_words1 = [w for w in text_words1 if not re.search('(@|#|http|rt)', w)]
请注意,我使用的是 re.search
,因为它会检查字符串中任何位置的匹配项,而 re.match
仅在字符串的开头检查匹配项。这很重要,因为您要删除以 and/or 开头且包含这些字符的单词。
您的代码段的问题是您在迭代时删除了项目。 len(text_words1)
因此不允许您检查每个列表项。将打印语句添加到 while
循环中,您就会明白我的意思。
当字符串以“@”、“#”、"http" 或 "rt" 开头或包含这些字符串时,我试图从列表中删除一些字符串。下面是示例列表。
text_words1 = ['@football', 'haberci', '#sorumlubenim', 'dedigin', 'tarafsiz', 'olurrt', '@football', 'saysaniz', 'olur', '#sorumlubenim', 'korkakligin', 'sonu']
根据上面的列表,我想删除“@football”和“#sorumlubenim”。我尝试了下面的代码。
i = 0
while i < len(text_words1):
if text_words1[i].startswith('@'):
del text_words1[i]
if text_words1[i].startswith('#'):
del text_words1[i]
i = i+1
print 'The updated list is: \n', text_words1
但是,上面的代码只删除了一些字符串,并没有删除所有以“@”或“#”符号开头的字符串。
然后,我将下面的代码添加到上面的代码中,因为并非所有感兴趣的字符串都以“@”、“#”或 "http" 开头,但包含这些符号。
while i < len(text_words1):
if text_words1[i].__contains__('@'):
del text_words1[i]
if text_words1[i].__contains__('#'):
del text_words1[i]
if text_words1[i].__contains__('http'):
del text_words1[i]
i = i+1
print 'The updated list: \n', text_words1
以上代码删除了一些包含“#:”或“@”但不是全部的项目。
有人可以告诉我如何删除所有以“@”、“#”、"http" 或 "rt" 开头或包含的项目吗?
正如评论所指出的那样。使用您的方法,您将失去对列表索引的引用,因此不会迭代整个列表。您可以使用列表理解来删除不需要的词
new_list = [i for i in text_words1 if not i.startswith(('@','#'))]
这是我的解决方案:
import re
text_words1 = ['@football', 'haberci', '#sorumlubenim', 'dedigin', 'tarafsiz', 'olurrt', '@football', 'saysaniz', 'olur', '#sorumlubenim', 'korkakligin', 'sonu']
for i, word in reversed(list(enumerate(text_words1))):
if re.search('(@|#|http|rt)', word):
del text_words1[i]
有了列表理解:
text_words1 = [w for w in text_words1 if not re.search('(@|#|http|rt)', w)]
请注意,我使用的是 re.search
,因为它会检查字符串中任何位置的匹配项,而 re.match
仅在字符串的开头检查匹配项。这很重要,因为您要删除以 and/or 开头且包含这些字符的单词。
您的代码段的问题是您在迭代时删除了项目。 len(text_words1)
因此不允许您检查每个列表项。将打印语句添加到 while
循环中,您就会明白我的意思。