【问题标题】:delete an item in a list of (events ) in a list of (dates)在(日期)列表中删除(事件)列表中的项目
【发布时间】:2015-11-01 22:06:06
【问题描述】:
def command_add(date, event, calendar):
if date not in calendar:
    calendar[date] = list()
calendar[date].append(event)


calendar = {}
command_add("2015-10-29", "Python class", calendar)
command_add("2015-10-12", "Eye doctor", calendar)
command_add("2015-10-12", "lunch with sid", calendar)
command_add("2015-10-29", "Change oil in blue car", calendar) 
command_add("2015-10-29", "test car", calendar)
print(calendar)

def command_show(calendar):
    for (date, event) in sorted(calendar.items()):
        print(date+':')
        for i in enumerate(event):
            print('    '+str(i[0])+': '+i[1])

command_show(calendar)

def command_delete(date, entry_number, calendar):
 for (date, event) in sorted(calendar.items()):
     for i in enumerate(event):
        del i[entry_number]

def command_delete(date, entry_number, calendar):
     for (date, event) in sorted(calendar.items()):
         for i in enumerate(event):
             i.remove(entry_number)


command_delete("2015-10-29", 2, calendar)
command_show(calendar)

我尝试了这 2 种方法,但我似乎无法弄清楚如何访问事件以删除某个日期的特定事件 对 command_delete 的调用应该删除 command_add 函数的第三个条目,因为它从 0 开始计数

错误是我得到元组对象不支持删除或删除项目

【问题讨论】:

  • enumerate 返回一个tuple:即(0, event[0]), (1, event[1]), (2, event[2]),... 这意味着i 是一个tuple,它是不可变的
  • 代码有很多问题。 0) 两个函数名为command_delete。 1) date 参数被覆盖,因此丢失。 2) 检查date 参数匹配的代码在哪里?即 date 参数未使用。 3) 你为什么要对日历进行排序?然后在排序后的seq上使用bisect... 4)command_add函数中的缩进是错误的
  • 是的,我为命令删除设置了 2 个选项,因为它们都不起作用,我想也许人们至少会喜欢看到我尝试了一些东西以及我正在尝试做的事情。我对日历进行排序,所以当我打印它时,它会以正确的日期顺序输出。如果我是一个元组,我可以删除整个元组
  • 研究我的答案,我修正并简化了你的代码:)

标签: python list events


【解决方案1】:

根据我最初对您的代码的 cmets:

我可以看到许多问题;例如

0) 两个函数名为command_delete

1) 在command_delete 函数中:

1.1) 日期参数被覆盖,因此丢失。

1.2) 检查日期参数匹配的代码在哪里?即未使用日期参数。

1.3) 为什么要对日历进行排序?

1.4) enumerate 返回一个元组:即 (0, event[0]), (1, event1), (2, event[2]),... 这意味着 i 是一个元组,这是不可变的。令人惊讶的是,在 command_show 中,您正确地将其用作元组,而不是在这里。

2)command_add函数中的缩进错误

现在试试这个

from collections import defaultdict

def command_add(date, event, calendar):
    calendar[date].append(event)


def command_show(calendar):
    for date, event in sorted(calendar.items()):
        print(date+':')
        for i, el in enumerate(event):
            print('    {}: {}'.format(i, el))


def command_delete(date, entry_number, calendar):
    events = calendar.get(date)
    if events:
        del events[entry_number]


calendar = defaultdict(list)

command_add("2015-10-29", "Python class", calendar)
command_add("2015-10-12", "Eye doctor", calendar)
command_add("2015-10-12", "lunch with sid", calendar)
command_add("2015-10-29", "Change oil in blue car", calendar) 
command_add("2015-10-29", "test car", calendar)
command_show(calendar)

print('now lets delete the "test car" appointment')

command_delete("2015-10-29", 2, calendar)
command_show(calendar)

产生

2015-10-12:
    0: Eye doctor
    1: lunch with sid
2015-10-29:
    0: Python class
    1: Change oil in blue car
    2: test car
now lets delete the "test car" appointment
2015-10-12:
    0: Eye doctor
    1: lunch with sid
2015-10-29:
    0: Python class
    1: Change oil in blue car

请花时间研究defaultdict的行为,例如PMOTW

【讨论】:

  • 这是非常好的代码,我喜欢你如何清理我的命令,显示它更合乎逻辑。 .get 方法也非常适合处理事件。只是为了我的澄清,如果发生事件,你怎么能留下来:这是一个条件。我很感激
  • calendar.get(date),默认情况下,如果字典中不存在date 键,则返回None。当在布尔表达式中解释时,值 None 被认为是 False。就像整数0(零)和空字符串""
  • 如果您认为我的回答比其他人的回答正确并更好地解决了您的问题,请将其标记为已接受。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
相关资源
最近更新 更多