2012-03-08 3 views
1

Мне нужно уметь ограничивать элементы, которые можно добавить в список. Как и в игре с пасьянсом, мне нужен элемент, который нужно добавить в список, если он должен следовать этому элементу в алфавитном порядке, а если он не возвращается, то возвращается ошибка. например; буква d может быть добавлена ​​перед буквой c, если ее другая буква или неправильный порядок, то карта не будет перемещена.Как добавить правила в список в python

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

a = ['a','c','e','j','h'] 

b = ['b','d','f','i','g'] 

def list_a(): 

    loop = 0 
    choice = 0 

    while loop == 1: 
     print('''Choose from one of the following options: 
        1. Move item from list b to list a 
        2. add item to list a!''') 

     choice = int(input("What would you like to do?: ")) 
     if choice == 1: 
      move_item() 

     elif choice == 2: 
      add_item() 
    return choice 

    print('List a: ',a) 
    print('List b: ',b) 




def move_item(): 
    loop = 0 
    choice = 0 

    while loop == 1: 
     print('''Choose from one of the following options: 
        1. Move item 1 
        2. move item 2 
        3. Move item 3 
        4. move item 4 
        5. Move item 5!''') 

     choice = int(input("What would you like to do?: ")) 
     if choice == 1: 
      a.append(b.pop(0)) 

     elif choice == 2: 
      a.append(b.pop(1)) 

     elif choice == 3: 
      a.append(b.pop(2)) 

     elif choice == 4: 
      a.append(b.pop(3)) 

     elif choice == 5: 
      a.append(b.pop()) 

    return choice 

def add_item(): 
    print() 

list_a() 
+2

Это домашнее задание? Кроме того, почему не просто список подкласса? –

+0

выглядит как домашнее задание для меня! Это просто, чтобы даже взглянуть за заголовок! –

+0

Несколько вопросов с вашим кодом и вопросом. Для кода: проверялись ли вы на пустой/неприемлемый ввод. Например, если я введу 'asdf' в первое приглашение,' choice' будет '0' (если он может даже ввести бесконечный цикл в первую очередь, так как вы не увеличиваете/изменяете цикл). – Edwin

ответ

2

Создать подкласс списка и переопределить SetItem, вставки, и/или то, что вам нужно, чтобы сохранить свой бизнес-логику.

class MyList(list): 
    def passes_rules(self, idx, value): 
    """ Checks to see if this value can be set to this index """ 

    def __setitem__(self, idx, value): 
    if self.passes_rules(idx, value): 
     super(MyList, self).__setitem__(idx, value) 

Кто-то, вероятно, может сказать нам, если SetItem достаточно, или если вам нужно беспокоиться о Append и вставить, а также. Экспериментация тоже работала, но дайте мне знать, что вы найдете. :)

0

Вы можете проверить, подходит ли letter1 до letter2 в алфавите с чем-то вроде этого.

import string 
if string.ascii_lowercase.find(letter1) < string.ascii_lowercase.find(letter2): 
    print("Letter 1 comes before letter 2") 
+1

Письма можно сравнивать напрямую, например. выражение ''a' <'b'' истинно. –