我无法从集合中删除日期时间对象?
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])
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])