使用正则表达式从2个python列表中删除某些元素

时间:2018-02-17 23:55:28

标签: python

我需要一些python列表的帮助。

file_data=["today is good","happiness is very nice", "i am hungry","i need to go to gym"]
file_names=["_podcast_podcast_2","article_about_happiness","podcast_podcast_34","article about fitness"]

我需要删除与"播客"相关的元素。如果podcast出现在file_names中,则删除该元素并删除file_data的相应元素。

必需的输出:

file_data=["happiness is very nice", "i need to go to gym"]
file_names=["article_about_happiness","article about fitness"]

2 个答案:

答案 0 :(得分:3)

file_data, file_names = zip(
     *(i for i in zip(file_data, file_names) if 'podcast' not in i[-1])
)

说明:

  1. 我将2个列表转换为一个列表,其中每个元素都是一对(数据,名称)。这就是zip的工作方式。
  2. 我使用list comprehension只考虑第二项在名称中没有“podcast”的对。正则表达式在这里会有点矫枉过正。您可以在Python中执行if "substring" not in "string"
  3. 然后,我将其解压缩以获得2个单独的列表(使用zip(*list))。我将它们分配给了初始变量。

答案 1 :(得分:1)

使用列表理解的简单单行:

file_names, file_data = [[f, file_data[i]] for i, f in enumerate(file_names) if "podcast" not in f]

输出:

['article about fitness', 'i need to go to gym']
['article_about_happiness', 'happiness is very nice']

我意识到我可能误读了最初的问题,并且错误地输出了输出。这是一个导致问题中列出的输出的版本:

grouped = [[file_names[i], file_data[i]] for i,f in enumerate(file_names) if "podcast" not in file_names[i]]
file_names = [i[0] for i in grouped]
file_data = [i[1] for i in grouped]

print(file_data)
print(file_names)

输出:

['happiness is very nice', 'i need to go to gym']
['article_about_happiness', 'article about fitness']