我有一个约会日期发生的事件。我想在显示日历时枚举事件列表。
此外,我需要能够从列表中删除一个事件。
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
答案 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
是一个元组,我正在使用slice
。 i[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))