枚举列表中的列表

时间:2015-11-01 04:28:28

标签: python list enumerate

我有一个约会日期发生的事件。我想在显示日历时枚举事件列表。

此外,我需要能够从列表中删除一个事件。

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

3 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分: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必须是一个序列,一个迭代器或一些支持迭代的对象   __next__()返回的迭代器的enumerate()方法返回一个包含计数的元组(从start开始,默认为0)和迭代迭代得到的值。

如果[(0, 'Python class'), (1, 'Eye doctor'), (2, 'lunch with sid')]evernt,它将返回['Python class', 'Eye doctor', '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') 1}}在第二个循环,等等。

然后,如果你想打印像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了解详情。

答案 2 :(得分:0)

您可以使用负责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))