Python从列表中删除项

时间:2015-09-21 10:20:01

标签: python

我是Python的新手,只是在努力工作,因为我团队中的另一个人离开了,需要在线上工作,所以如果这是一个愚蠢的问题,请道歉。

我需要从列表中删除项目(它们将包含某个短语)并使用Google搜索并尝试了一些方法,但它似乎无法正常工作。

我目前得到的是,

def get_and_count_card_files(date):
    # Retrieve the DC and SD card files
    dc_files = dc_card_files.get_dc_files(dc_start_location, date)
    sd_files = sd_card_files.get_sd_files(sd_start_location)
    print(dc_files)

if '*NoCover*' in dc_files:
    dc_files.remove('*NoCover*')

Dc_files是列表(文件名串),我需要删除文件名中包含NoCover的任何内容。它确实存在,因为打印功能告诉我它。

任何人都知道我做错了什么

enter image description here

3 个答案:

答案 0 :(得分:6)

使用这段代码,*不会在这些上下文中执行glob或正则表达式:

if '*NoCover*' in dc_files:
    dc_files.remove('*NoCover*')

所以最好说:

if 'NoCover' in dc_files:

但是,我们必须在列表中找到要删除的正确条目,而不使用通配符。

对于一个小列表,您可以迭代它。列表理解会做:

new_dc_files = [dc for dc in dc_files if 'NoCover' not in dc]

这是一种紧凑的说法:

new_dc_files = list()
for dc in dc_files:
    if 'NoCover' in dc:
         continue
    new_dc_files.append(dc)

答案 1 :(得分:0)

if '*NoCover*' in dc_files:会在列表dc_files中查找与“ NoCover ”明确匹配的元素。

你能做什么,是

# Iterate over the list backwards, this will stop you from skipping elements
# you want to check in the next iteration if you remove something
for index, dc_file in enumerate(dc_files[::-1]):
    if 'NoCover' in dc_file:
        dc_files.pop(index)

或者,如果您有更复杂的模式匹配要求,可以查看使用正则表达式。

答案 2 :(得分:0)

您可以使用Python列表推导来过滤掉不需要的条目:

def get_and_count_card_files(date):
    # Retrieve the DC and SD card files
    dc_files = dc_card_files.get_dc_files(dc_start_location, date)
    sd_files = sd_card_files.get_sd_files(sd_start_location)

    print(dc_files)
    dc_files = [file for file in dc_files if 'NoCover' not in file]