Python 如何从映射(类型、列表)中删除值?

Python 如何从映射(类型、列表)中删除值?,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一个项目列表(排除的名称)和一个dict(日期dict),我试图从日期dict中的值列表中删除该值 def _get_dates(name): DATE_FORMATS = ['%Y%m%d', '%Y%m%d_%H%M%S'] for date_format in DATE_FORMATS: try: date_of_index = datetime.strptime(name.split('-')[-1], date_format)

我有一个项目列表(
排除的名称)和一个dict(
日期dict
),我试图从
日期dict
中的值列表中删除该值

def _get_dates(name):
    DATE_FORMATS = ['%Y%m%d', '%Y%m%d_%H%M%S']
    for date_format in DATE_FORMATS:
        try:
            date_of_index = datetime.strptime(name.split('-')[-1], date_format).date()
        except ValueError:
            pass
        else:
            break
    else:
        date_of_index = date.today()
    return date_of_index

date_dict = defaultdict(list)
index_list = ['test', 
'name-20180213', 
'name-20180102_000012', 
'name-20180102', 
'name-20180101_000012', 
'name-20180101_000016'] 
for name in index_list:
   date_dict[_get_dates(name)].append(name)

>>> date_dict
    defaultdict(<type 'list'>, {datetime.date(2018, 1, 2): ['name-20180102_000012', 'name-20180102'], datetime.date(2020, 2, 4): ['testname'], datetime.date(2018, 1, 1): ['name-20180101_000012', 'name-20180101_000016'], datetime.date(2018, 2, 13): ['name-20180213']})
>>> excluded_names = ['name-20180102_000012']

但它并没有删除那个特定的值。我在这里做错了什么吗?

您试图从字典本身中删除,而不是从字典中的列表中删除。试试这个:

for single_date in date_dict:
    for name in date_dict[single_date]:
        if name in excluded_names:
            date_dict[single_date].remove(name)

为此使用字典有一些困难,即您试图通过查找值()来删除键,并且使用迭代方法(通过使用del)从字典中删除项会导致“RuntimeError:字典在迭代过程中更改了大小”

我尝试先搜索要删除的键,将它们添加到列表中,然后从字典中删除它们,如下所示:

delete_keys = []

for key, val in d.items():
    for i in val:
        if i in excluded_names:
            delete_keys.append(key)

for i in delete_keys:
    del d[i]

defaultdict
(及其基类
dict
)没有
remove
方法。为什么要执行
排序(date\u dict()…)
?您不能调用
dict
实例
default\u dict
dict
在删除项目方面并没有什么不同,所以这个问题似乎是重复的。@Grismar:OP实际上询问了如何从字典中删除某些内容。使用字典理解或生成器表达式(如重复问题的已接受答案所示)将生成常规字典(即不再是
defaultdict
)-这可能对OP有影响,也可能对OP无影响。当然,这是可以修复的,但是我觉得应该指出。@martineau-这就是为什么该链接中的第二个答案有一些值得投票的原因,它显示了如何使用
del
进行操作,但仍然没有删除。只是确认一下,但是您想从列表中删除string元素还是从字典中删除列表?我的代码是针对第一种情况的。>>>如果在获取列表中排除索引名称,则从中删除(日期,2):。。。对于日期记录中的单个日期:。。。对于日期[single_date]中的名称:。。。如果名称在排除的索引中,则名称:。。。日期(2018年1月2日):['name-1-20180102_000012','name-1-20180102'],datetime.date(2020年2月4日):['testname'],datetime.date(2018年1月1日):['name-1-20180101_000012','name-1-20180101_000016'],datetime.datetime(2018年2月13日):['name-1-20180103']如果您想从dict中删除列表,请将最后一行替换为(del date_dict[single_date]),我需要从列表中删除该字符串..尝试了您的,但仍然没有删除我只想从该值中删除一项,而不是整个键。这似乎对您有效,但对我无效。我的听写有什么问题吗?它表示defaultdict(,{datetime.date(2018,1,2):['name-20180102_000012','name-20180102'],datetime.date(2020,2,4):['testname'],datetime.date(2018,1,1):['name-20180101_000012','name-20180101_000016'],datetime.date(2018,2,13):['name-20180213'])用“=”替换“,”并删除最后一个“)”它将是这样的defaultdict={datetime.date(2018,1,2):['name-20180102_000012','name-20180102'],datetime.date(2020,2,4):['testname'],datetime.date(2018,1,1):['name-20180101_000012',name-20180101_000016'],datetime.date(2018,2,13):['name-20180213']}我使用defaultdict(list)创建地图。用完整代码更新了问题。
delete_keys = []

for key, val in d.items():
    for i in val:
        if i in excluded_names:
            delete_keys.append(key)

for i in delete_keys:
    del d[i]
for row_values in defaultdict.values():
    for value in row_values: 
        if(value in excluded_names):
            row_values.remove(value)