2015-12-25 4 views
1

У меня есть список 2-х кортежей с именем listuple и еще один простой список с именем list0. Я хочу сгенерировать список 1 s и -1 s на основе сравнения двух моих списков.Pythonic подход к скрипту сравнения/генерации списка

def Vectomparison (listuple, list0): 
    result = [] 
    for EachElement in listuple: 
     if EachElement [0] in list0: 
      result.append (1) 
     else: 
      result.append (-1) 
    return result 

Но я действительно считаю, что это не пифонический подход. Любая идея для этого Pythonically более сжатый?

ответ

2

Прямой переписана с использованием списка comprehesion и тройная оператор:

def Vectomparison (listuple, list0): 
    return [1 if item[0] in list0 else -1 for item in listuple] 

Обратите внимание, что item[0] in list0 использует линейный поиск, если list0 список. Это делает алгоритмы временной сложности O(N*M) где N = len(listuple), M = len(list0)

Вы можете сделать это быстрее:

def Vectomparison (listuple, list0): 
    set0 = set(list0) 
    return [1 if item[0] in set0 else -1 for item in listuple] 

Эта версия имеет временную сложность O(N+M)

+1

Пожалуйста, как Вы оцениваете/формулированию временную сложность в таких задачах ? –

+0

Линейный поиск в списке принимает шаги «O (N)». Выполнение этого 'M' раз дает алгоритм' O (N * M). Во втором примере построение набора принимает значение «O (M)» (поскольку вставка нового элемента - «O (1)»), а построение окончательного списка - «O (N)», поэтому общий «O (N + M) ' –

+0

@MerlotLatterian также я предлагаю вам использовать строчные имена функций –

Смежные вопросы