2014-09-14 2 views
0

Я изучаю python и имею рабочий код (показано ниже). Тем не менее, я хотел бы знать, есть ли лучший способ переписать его ниже.Python list popping and appending

То, что я пытаюсь сделать, это сопоставить список A, который передается методу против предопределенного списка B. Если элемент в списке A содержит элемент в списке B, я бы хотел его переместить в конец из списка А. Вот пример:

# example 1 
a = [1, 2, 3, 4, 5] 
sanitized_list = sanitize(a) # [3, 4, 5, 1, 2] 

# example 2 
a = [3, 6, 1, 7, 4] 
sanitized_list = sanitize(a) # [3, 6, 7, 4, 1] 


def sanitize(arg): 
    # predefined list 
    predefined_list = [1, 2] 

    for item in predefined_list: 
     try: 
      # check to see if 'arg' contain any item 
      # in the predefined list 
      i = arg.index(item) 

      # save the value of arg[i] 
      j = arg[i] 

      # remove "j" from "arg" 
      arg.pop(i) 

      # append item to end of "arg" 
      arg.append(j) 
     except ValueError: 
      pass 

    return arg 
+3

Этот вопрос, вероятно, лучше всего подходит для http://codereview.stackexchange.com – jonrsharpe

+2

Первое, что я хотел бы сделать это используйте другое имя переменной для 'list'. Он затеняет тип по умолчанию. – karthikr

ответ

3

Вы можете использовать сортировку; просто сортировать результат теста сдерживания; False сортируется до True, но в противном случае ваш заказ будет оставаться стабильным. Вы можете сделать b набор, чтобы сделать тест сдерживания быстрее:

def sanitize(lst): 
    # predefined list 
    b = {1, 2} 
    return sorted(lst, key=lambda v: v in b) 

Я сделал b набор здесь, но это не является обязательным (но быстрее, если вы делаете).

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

Обратите внимание, что вместо list здесь использовалось другое имя для аргумента; вы не хотите затенять встроенный тип.

Демо:

>>> a = [1, 2, 3, 4, 5] 
>>> def sanitize(lst): 
...  # predefined list 
...  b = {1, 2} 
...  return sorted(lst, key=lambda v: v in b) 
... 
>>> sanitize(a) 
[3, 4, 5, 1, 2] 
-1

Операции между списками легче, если превратить их в sets.

a = [1, 2, 3, 4, 5] 

def sanitize(l): 
    b = [1, 2] 

    try: 
     sanitized = list(set(l) - set(b)) + b 
     return sanitized 
    except ValueError: 
     return None 
+0

Что, если это аргумент [1, 5, 6, 3]? Результат должен быть [5, 6, 3, 1]. –

0

Лучше создать всегда новый список:

def sanitize(l): 
    b = set([1, 2]) 
    result = ([], []) 
    for item in l: 
     result[item in b].append(item) 
    result[0].extend(result[1]) 
    return result[0]