2016-09-09 2 views
2

Мне нужно создать понимание списка и добавить один дополнительный элемент в начале и в конце. Есть ли лучший способ, чем просто использовать вспомогательную функцию?Можно ли перечислить понимание, есть префикс, суффикс?

# convert tuple from permutation into a list with predecessor and successor 
def perm_to_list(predecessor, perm, successor): 
    result = [predecessor] 
    result.extend(list(perm)) 
    result.append(successor) 
    return result 

candidates = [perm_to_list(prefix, x, suffix) 
       for x in permutations(something)] 

ответ

3

Чтобы соответствовать коду образца (где вы добавить префикс и суффикс к каждому элементу списка понимания)

candidates = [[prefix] + list(x) + [suffix] for x in permutations(something)] 

Для того, чтобы ответить на вопрос, который вы на самом деле задал (добавить префикс и суффикс к сам список постижение)

candidates = [prefix] + [somefunction(x) for x in permutations(something)] + [suffix] 
+0

Спасибо. Это то, что я искал. (Хотя скорость одна и та же. Это путь в проблеме коммивояжера.) –

1

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

Это двухсторонняя структура очереди, а также такие предложения O (1) добавляя слева, в отличие от O (N) для списков.

from collections import deque 
dq = deque(range(1,10)) # Test list passed to deque -> deque([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
dq.appendleft(0) 
dq.append(10) 
print dq 
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
+0

Хорошо, но я никогда не пытался добавить в начало. Я только что начал новый список с префиксом и добавлен в конец. Это не узкое место, поэтому я не слишком беспокоюсь о скорости. –

1

Существует новая feature доступна только в Python 3.5:

Распаковка итерируемыми в любом месте в списке:

[prefix, *iterable, suffix] 

(Я желаю, чтобы они добавили его раньше)

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