2015-06-13 3 views
-3

У меня есть вложенные словари, и я хочу обновить значения значений ключей вторых словарей, чтобы он также отражал значение словаря.Как получить доступ к значениям вложенных словарных ключей в python?

class Screen_Seat: 
    def __init__(self,screen,show,num_seats,day): 
     self.screen_id = screen 
     self.show = show 
     self.num_seats = num_seats 

    self.seats = {('screen1','day4'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
        ('screen1','day5'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
        ('screen1','day6'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
        ('screen1','day7'):{'show1':100,'show2':100,'show3':100,'show4':100},} 

Я хотел бы обновить значение ниже клавиш

self.seats['screen1','day4','show4'] =90 

так, что:

self.seats = {('screen1','day4'):{'show1':100,'show2':100,'show3':100,'show4':**90**}, 
         ('screen1','day5'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
         ('screen1','day6'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
         ('screen1','day7'):{'show1':100,'show2':100,'show3':100,'show4':100},} 

, как я могу сделать это в Python?

Edit:

class Screen_Seat: 
    def __init__(self,screen,show,num_seats,day): 
     self.screen_id = screen 
     self.show = show 
     self.num_seats = num_seats 

     self.seats = {('screen1','day4'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
     ('screen1','day5'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
     ('screen1','day6'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
     ('screen1','day7'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen2','day1'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
     ('screen2','day2'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
     ('screen2','day3'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
        } 

class Screen_Booking(screen_seat): 
    def __init__(self,screen,show,num_seats,day): 
     screen_seat.__init__(self,screen,show,num_seats,day) 
     self.booking_screen = screen 
     self.booking_show = show 
     self.booking_day=day 
     self.booking_seats=num_seats 

    def CheckAvailability(self): 
     self.seats[self.booking_screen,self.booking_day][self.booking_show] 
     if (self.seats[self.booking_screen,self.booking_day][self.booking_show] > int(self.booking_seats)): 
      self.seats[self.booking_screen,self.booking_day][self.booking_show]=(self.seats[self.booking_screen,self.booking_day][self.booking_show]-int(self.booking_seats)) 

      #print self.seats[self.booking_screen,self.booking_day][self.booking_show] 
      print 'seat booked' 
     else: 
      print 'Sorry, No seats available in Screen1. Please try other Screens' 


A1 = Screen_Booking('screen1','show1','98','day4') 
A1.CheckAvailability() 
A1 = Screen_Booking('screen1','show1','10','day4') 

выход:

2 
seat booked 
90 
seat booked 

Второй раз он должен напечатать «К сожалению, нет свободных мест в Screen1. Попробуйте другие экраны '

Помогите мне определить проблему в моем коде?

+1

'' self.seats [('screen1', 'Day4')] [ 'show4'] = 90'' –

+0

новые значения не получают обновленные значений класса. – Vilva

+0

В вашем коде отсутствует 'screen7'. –

ответ

1

Используйте это:

self.seats[('screen1', 'day4')]['show4'] = 90 

Выход:

self.seats 
{('screen1', 'day4'): {'show1': 100, 'show2': 100, 'show3': 100, 'show4': 90}, 
('screen1', 'day5'): {'show1': 100, 'show2': 100, 'show3': 100, 'show4': 100}, 
('screen1', 'day6'): {'show1': 100, 'show2': 100, 'show3': 100, 'show4': 100}, 
('screen1', 'day7'): {'show1': 100, 'show2': 100, 'show3': 100, 'show4': 100}} 

Первый Доступ к screen1 Day4 показывает на ('screen1', 'day4') кортеж в качестве ключа в self.seats словаре. Затем войдите в ключ 'show4' внутреннего словаря на 'show4' и установите его значение 90.

Возможно, вы новичок в python. Попробуем разобраться в процессе мышления на следующих трех шагах.

Шаг1:

('screen1', 'day4') дает доступ к {'show1': 100, 'show2': 100, 'show3': 100, 'show4': 100} внутреннего словаря.

self.seats[('screen1', 'day4')] 
{'show1': 100, 'show2': 100, 'show3': 100, 'show4': 100} 

Шаг2:

Теперь доступ show4 по 'show4' ключ в полученном словаре из предыдущего шага.

self.seats[('screen1', 'day4')]['show4'] 
100 

Step3:

Обновить значение, полученное для Screen1-DAY4-show4 90.

self.seats[('screen1', 'day4')]['show4'] = 90 

self.seats[('screen1', 'day4')]['show4'] 
90 

код Решение:

Проверьте этот подход, если он работает для тебя.

class ScreenBooking(object): 

    def __init__(self): 
     super(ScreenBooking, self).__init__() 
     self.seats = { 
      ('screen1','day4'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen1','day5'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen1','day6'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen1','day7'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen2','day1'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen2','day2'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
      ('screen2','day3'):{'show1':100,'show2':100,'show3':100,'show4':100}, 
     } 
     self.shows = ['show1', 'show2', 'show3', 'show4'] 


    def check_valid_details(self, screen, show, day): 
     """ 
     Check if booking details are valid and return True/False accordingly. 
     """ 
     if (screen, day) not in self.seats or show not in self.shows: 
      return False 
     return True 

    def book_seats(self, screen, show, no_of_seats, day): 
     """ 
     Book seats after checking valid booking details and the remaining seats. 
     """ 
     valid_details = self.check_valid_details(screen, show, day) 
     if not valid_details: 
      print 'Invalid booking details!' 
      return 
     show_total_seats = self.seats[(screen, day)][show] 
     if show_total_seats > int(no_of_seats): 
      show_remaining_seats = show_total_seats - int(no_of_seats) 
      self.seats[(screen, day)][show] = show_remaining_seats #update the seats count 
      print '%s seat(s) booked'%(no_of_seats) 
     else: 
      print 'Sorry, No seats available in %s. Please try other Screens'%(screen) 

a1 = ScreenBooking() 
a1.book_seats('screen1','show1','98','day4') 
a1.book_seats('screen1','show1','10','day4') 
+0

Вы можете помочь с этим обновленным вопросом? – Vilva

+0

Вы получаете эту выгоду, потому что вы снова создаете новый экземпляр 'screen_booking' с значениями' seat', как определено в классе 'screen_seat'. –

+1

Эй, Люсиктор! Я закодировал решение проблемы. Проверьте, работает ли это для вас. –

1

Ваш словарь имеет два вложенных уровня, один с индексом с кортежем ('screenX', 'dayX'), а другой - с строкой showX. Обратите внимание на следующее:

>>> foo.seats['screen1', 'day4'] 
{'show4': 90, 'show2': 100, 'show1': 100, 'show3': 100} 
>>> foo.seats['screen1', 'day4']['show4'] 
90 

Первое выражение дает словарь, который вы должны проиндексировать снова для того, чтобы получить нужный элемент. Таким образом, окончательное выражение:

foo.seats['screen1', 'day4']['show4'] 
#  ^    ^
#   |     | 
#   +-- First level +-- Second level 
Смежные вопросы