【问题标题】:enumerating a list in a list枚举列表中的列表
【发布时间】:2015-11-01 04:28:27
【问题描述】:

我有一个日期,其中包含在该日期发生的事件。我想在显示日历的日期枚举事件列表。

我还需要能够从列表中删除事件。

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)
print(calendar)

def command_show(calendar):
    for (date, event) in calendar:
       print(date, enumerate(event))

command_show(calendar)

我认为这可以让我访问日期下的辅助列表并枚举它,但我得到一个错误。

示例:

command_show(calendar)
    2015-10-20:
        0: stackover flow sign up
    2015-11-01:
        0: stackoverflow post
        1: banned from stack overflow

【问题讨论】:

    标签: python list enumerate


    【解决方案1】:

    for ... in calendar: 只会遍历字典中的键。您需要调用.items() 来获取键和值

    def command_show(calendar):
        for date, events in calendar.items():
            print(date, enumerate(events))
    

    您还可以使用.setdefault() 方法简化command_add

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

    【讨论】:

      【解决方案2】:

      只需将您的 command_show() 函数更改为此,如果您不使用 dict.items() 那么您将获得键(不是键和值):

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

      输出:

      2015-10-29:
          0: Python class
          1: Change oil in blue car
      2015-10-12:
          0: Eye doctor
          1: lunch with sid
      

      关于我为什么要这样做:

      for i in enumerate(event):
          print('    '+str(i[0])+': '+i[1])
      

      如您所见,我在这里使用enumerate() 函数。来自文档:

      返回一个枚举对象。 iterable 必须是序列、迭代器或其他支持迭代的对象。
      enumerate() 返回的迭代器的 __next__() 方法返回一个元组,其中包含一个计数(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。

      所以如果evernt['Python class', 'Eye doctor', 'lunch with sid'],它将返回类似[(0, 'Python class'), (1, 'Eye doctor'), (2, 'lunch with sid')] 的内容。

      现在我们有了[(0, 'Python class'), (1, 'Eye doctor'), (2, 'lunch with sid')],当我们在其上使用for 循环时,就像for i in enumerate(event)i 将在第一个循环中为(0, 'Python class'),在第二个循环中为(1, 'Eye doctor'),等等。

      然后,如果要打印0: Python class之类的东西(在sting前面有一些空格),我们需要手动输入' '+之类的空格(+可以在这里加入字符串,例如, 'foo'+'bar'foobar)。

      然后,因为i 是一个元组,所以我使用slicei[0] 可以获得该元组中的第一个元素,i[1] 可以获得第二个元素,依此类推。

      因为i[0] 是一个整数,我们不能只做0 + 'foobar' 之类的事情(将引发TypeError: unsupported operand type(s) for +: 'int' and 'str')。所以我们需要使用str() 函数将其转换为字符串。然后……也许你会明白。


      你也可以这样做:

      for num, event in enumerate(event):
          print('    '+str(num), event, sep=': ')
      

      更清楚? for num, event in enumerate(event) 将在第一个循环中给出类似 num = 0, evert = 'Python class' 的内容,并且...正如我所说的。

      关于sep,您可以查看the document了解更多详情。

      【讨论】:

      • 嘿,这确实很好,但我只是想澄清一些事情以供我理解。当你在 enumerate(event) 中通过 i 迭代 for 循环时。 str(i[0]) 和 + i[1],第一个 1 如何添加枚举列表的数字 (str(i[0]),第二个 i[1] 获取我刚刚没有的所有事件'不知道这种交互是如何工作的。因为我也希望能够从列表中删除某些内容,所以我试图了解在给定日期删除特定条目需要访问什么
      • 更具体地说,你为什么把 [0] 和 [1] 放在括号里,这是做什么的
      • 非常感谢您深思熟虑的回复,我很感激它真的帮助我理解
      【解决方案3】:

      您可以使用defaultdict 为您处理if 检查;并循环遍历calendar.iteritems(),以便在每次迭代时获得key,value 的元组。

      from collections import defaultdict
      
      calendar = defaultdict(list)
      
      def command_add(date, event, calendar):
          calendar[date].append(event)
      
      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)
      print(calendar)
      
      for date, events in calendar.iteritems():
          print(date)
          for event in events:
              print('\t{}'.format(event))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多