2015-11-01 3 views
4

У меня есть дата с событиями, которые произошли на дату. Я хочу перечислить список событий в день, когда я показываю календарь.перечисление списка в списке

Также мне нужно уметь удалять событие из списка.

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 

ответ

2

Просто измените command_show() функцию на это, если вы не» t используйте 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(), возвращает кортеж, содержащий счетчик (от начала, который по умолчанию равен 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') на втором цикле и т.д.

И затем, если вы хотите напечатать что-нибудь например, 0: Python class (есть некоторые пробелы перед укусом), нам нужно вручную помещать пробелы, как ' '+ (+ может присоединиться к строкам здесь, например, '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 для получения более подробной информации.

+0

эй это работало очень хорошо, но я просто хотел прояснить что-то для моего понимания. когда u перебирает цикл for через i в перечислении (событие). как str (i [0]) и + i [1], первые 1 добавляют числа, чтобы перечислить список (str (i [0]), а второй i [1] получает все события, которые я просто не использовал, я знаю, как это взаимодействие работает, потому что я хочу иметь возможность удалять что-то из списка, поэтому я пытаюсь понять, что мне нужно будет получить, чтобы удалить конкретную запись в заданную дату – Sinoda

+0

более конкретно, почему вы положили [ 0] и [1] в скобках, что делает точно – Sinoda

+0

@ Синода, которую я отредактировал :) (кажется, немного длинный: P) –

4

for ... in calendar: будет только цикл по клавишам в словаре. Вам нужно позвонить .items(), чтобы получить как ключи и значения:

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

Вы можете также упростить command_add с помощью .setdefault() метода:

def command_add(date, event, calendar): 
    calendar.setdefault(date, []).append(event) 
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))