我无法从集合中删除日期时间对象?

I cant remove a datetime object from my set?

base = datetime.date.today()
dateset = set([base + datetime.timedelta(days=x) for x in range(20)]

for d in dateset:
 if d.weekday() == 0:
  dateset.discard(d)

如您所见,我想删除任何 weekday() 为 0 的日期时间对象。

但是上面的代码抛出了错误RuntimeError: Set changed size during iteration

非常感谢任何帮助。

您正在迭代一个在运行时改变其大小的对象,即您迭代 dateset,同时在 dateset.discard(d) 循环中丢弃其中的项目。

获取另一个迭代器,例如 for idx in range(len(dateset)): 进行迭代并相应地从 dateset 中删除项目。

与其创建集合然后删除项目,不如先将项目放入您想要的集合中。

代码:

base = datetime.date.today()
dateset = set([base + datetime.timedelta(days=x) for x in range(20) if (base + datetime.timedelta(days=x)).weekday() != 0])

输出:

>>> dateset
{datetime.date(2019, 12, 4),
 datetime.date(2019, 12, 5),
 datetime.date(2019, 12, 6),
 datetime.date(2019, 12, 7),
 datetime.date(2019, 12, 8),
 datetime.date(2019, 12, 10),
 datetime.date(2019, 12, 11),
 datetime.date(2019, 12, 12),
 datetime.date(2019, 12, 13),
 datetime.date(2019, 12, 14),
 datetime.date(2019, 12, 15),
 datetime.date(2019, 12, 17),
 datetime.date(2019, 12, 18),
 datetime.date(2019, 12, 19),
 datetime.date(2019, 12, 20),
 datetime.date(2019, 12, 21),
 datetime.date(2019, 12, 22)}

您可以使用不同的集合来收集要删除的条目:

import datetime
base = datetime.date.today()
dateset = set([base + datetime.timedelta(days=x) for x in range(20)])
remove = set()

for d in dateset:
 if d.weekday() == 0:
  remove.add(d)
dateset -= remove
print(dateset)

这里的问题是您正在迭代要更改的内容(正如错误告诉我们的那样)。实现目标的一种方法是集合理解。像这样:

base = datetime.date.today()
dateset = set([base + datetime.timedelta(days=x) for x in range(20)])

dateset = {d for d in dateset if d.weekday() != 0}

请注意,我们已将条件反转为 !=

如果循环遍历集合,则无法从集合中删除项目。如果工作日不是 0

,则使用 for 循环并将项目添加到集合中
base = datetime.date.today()
dateset = set()
for x in range(20):
    date = base + datetime.timedelta(days=x)
    if date.weekday() != 0:
        dateset.add(date)

或者使用这样的列表理解:

base = datetime.date.today()
dateset = set([base + datetime.timedelta(days=x) for x in range(20) if (base + datetime.timedelta(days=x)).weekday() != 0])