2015-09-05 4 views
4

Извините за неуклюжий заголовок. Я пытаюсь изучить Python, и я думал, что я бы организовал свои коллекции книг Skyrim одновременно. (Общее описание см. В следующем параграфе). У меня три книжных шкафа, одна в Уайтуне, одна в Мархарте и одна в Лейквью-Усадьбе. Я пытаюсь сделать функцию, которая берет имя книги, ищет список (содержит 3 строки и 3 дополнительных списка), и если книга уже находится в одной из моих библиотек, дайте мне сообщение о том, что я уже есть эта книга. Если книга не находится в одной из библиотек, добавьте ее в соответствующий вложенный список.Добавление строк к вложенным спискам строк, если список еще не содержит указанную строку

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

library = [ 'Whiterun', ['Book of Riddles', 'Dragonborn'], 'Markarth', ['Dwemer History'], 'Lakeview', ['Nightingales', 'Werewolves'] ] 

Что было бы наилучшим способом поиска в библиотеке данной книги?

+0

«добавить его в соответствующий вложенный список», можете ли вы привести пример? Как вы узнаете, какой из них подходит? – haraldkl

+0

например, add_book ('Dragonborn', library, 'Whiterun') ... Итак, я проверяю имя дома, если его Whiterun я добавляю его в первый вложенный список, если его Markarth я добавляю его ко второму вложенному список. Это была моя идея в любом случае –

+0

Вы уже сталкивались с Dicts (https://docs.python.org/2/library/stdtypes.html#dict)? – haraldkl

ответ

2

Если заказ не является проблемой, использовать Dict с наборами в качестве значений, имеющих названия книги:

library = {'Whiterun':{'Book of Riddles', 'Dragonborn'}, 
      'Markarth': {'Dwemer History'}, 
      'Lakeview': {'Nightingales', 'Werewolves'} } 

Затем сделать поиск, возвращая сообщение, если вы уже добавили книгу или добавить книгу в раздел:

def add_book(section, book, lib): 
    if book in lib[section]: 
     return "Already added {}".format(book) 
    library[section].add(book) 

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

def lookup(section, book, lib): 
    try: 
     if book in lib[section]: 
      return "Already added" 
    except KeyError: 
     return "Invalid section {}".format(section) 
    library[section].add(book) 
1

Очень кратко и грубый набросок, как это может выглядеть с Dict:

library = {} 
library['Whiterun'] = ['Book of Riddles', 'Dragonborn'] 
library['Markarth'] = ['Dwemer History'] 
library['Lakeview'] = ['Nightingales', 'Werewolves'] 

def add_book_to_lib(library, case, book): 
    if case in library: 
    if book in library[case]: 
     print('{0} already exists in {1}'.format(book,case)) 
    else: 
     library[case].append(book) 
     print('Added book {0}'.format(book)) 

    else: 
    library[case] = [book] 
    print('Created new case {0}'.format(case)) 

add_book_to_lib(library, 'Whiterun', 'Dragonborn') 
0

я придумал работу вокруг решения, который немного проще, чем моя оригинальная идея, но делает работу, которую я хочу. Он хранит книги в 3 отдельных списках и, следовательно, 3 отдельных текстовых файла с использованием pickle для сериализации файлов. Хотя это не соответствует соглашениям об именах питонов, потому что у меня будет около 400 сигнатур функций, чтобы напечатать их, поэтому я просто пошел на все капиталы для удобства.

''' 
Program to track what books I have in my libraries in 3 seperate houses in 
skyrim: Whiterun, Markarth, Lakeview Manor 
Uses 3 seperate lists for the 3 diff houses. 
''' 

import pickle 

WHITERUN = [] 
MARKARTH = [] 
LAKEVIEW = [] 



def print_lib(library): 
    for each_book in library: 
      print(each_book) 


def have_book(book): 
    if WHITERUN.count(book) > 0: 
      print('The book: ' + book + ' is already in Whiterun') 
      return True 
    elif MARKARTH.count(book) > 0: 
      print('The book: ' + book + ' is already in Markarth') 
      return True 
    elif LAKEVIEW.count(book) > 0: 
      print('The book: ' + book + ' is already in Lakeview') 
      return True 
    else: 
      return False 


def addbook(book, house): 
    if not have_book(book): 
      house.append(book) 
      house.sort() 



try: 
    with open('whiterun.txt', 'rb') as whiterun_lib: 
      WHITERUN = pickle.load(whiterun_lib) 
    with open('markarth.txt', 'rb') as markarth_lib: 
      MARKARTH = pickle.load(markarth_lib) 
    with open('lakeview.txt', 'rb') as lakeview_lib: 
      LAKEVIEW = pickle.load(lakeview_lib) 
except IOError as err: 
    print('File Error: ' +str(err)) 
except pickle.PicklingError as perr: 
    print('Pickling error: ' + str(perr)) 

print(WHITERUN) 
print(MARKARTH) 
print(LAKEVIEW) 


# whiterun books 
addbook('DRAGONBORN', WHITERUN) 


# markarth books 
addbook('CATS OF SKYRIM', MARKARTH) 

#lakeview books 
addbook('A DREAM OF SOVNGARDE', LAKEVIEW) 

print(WHITERUN) 
print(MARKARTH) 
print(LAKEVIEW) 


try: 
    with open('whiterun.txt', 'wb') as whiterun_lib: 
      pickle.dump(WHITERUN, whiterun_lib) 
    with open('markarth.txt', 'wb') as markarth_lib: 
      pickle.dump(MARKARTH, markarth_lib) 
    with open('lakeview.txt', 'wb') as lakeview_lib: 
      pickle.dump(LAKEVIEW, lakeview_lib) 
except IOError as err: 
    print('File Error: ' +str(err)) 
except pickle.PicklingError as perr: 
    print('Pickling error: ' + str(perr))