Вставка значений в определенные места в списке в Python
Я пытаюсь напечатать все возможные результаты данного списка, и мне было интересно, как добавить значение в различные местоположения в списке. Например, если мой список был [A,B]
, я хочу вставить X
во все возможные индексы списка, чтобы он возвращал эти [X,A,B]
, [A,X,B]
, [A,B,X]
.
Я думал об использовании range(len())
и цикла for, но не уверен, как начать.
Ответы
Ответ 1
Вы можете сделать это со следующим пониманием списка:
[mylist[i:] + [newelement] + mylist[:i] for i in xrange(len(mylist),-1,-1)]
В вашем примере:
>>> mylist=['A','B']
>>> newelement='X'
>>> [mylist[i:] + [newelement] + mylist[:i] for i in xrange(len(mylist),-1,-1)]
[['X', 'A', 'B'], ['B', 'X', 'A'], ['A', 'B', 'X']]
Ответ 2
Используйте insert() для вставки элемента перед заданной позицией.
Например, при
arr = ['A','B','C']
arr.insert(0,'D')
arr становится ['D', 'A', 'B', 'C'], потому что 'D' вставлен перед элементом с индексом 0.
Теперь, для
arr = ['A','B','C']
arr.insert(4,'D')
arr становится ['A', 'B', 'C', 'D'], потому что 'D' вставлен перед элементом в индексе 4 (который равен 1 за пределами конца массива).
Однако, если вы хотите сгенерировать все перестановки массива, есть способы сделать это уже встроенным в Python. Пакет itertools имеет генератор перестановок.
Вот пример кода:
import itertools
arr = ['A','B','C']
perms = itertools.permutations(arr)
for perm in perms:
print perm
распечатает
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
Ответ 3
Если вы хотите вставить список списка в список, вы можете сделать это:
>>> a = [1,2,3,4,5]
>>> for x in reversed(['a','b','c']): a.insert(2,x)
>>> a
[1, 2, 'a', 'b', 'c', 3, 4, 5]
Ответ 4
Исходя из JavaScript, это было то, что я использовал для "встроенного" через Array.prototype.splice(), поэтому Я сделал функцию Python, которая делает то же самое:
def list_splice(target, start, delete_count=None, *items):
"""Remove existing elements and/or add new elements to a list.
target the target list (will be changed)
start index of starting position
delete_count number of items to remove (default: len(target) - start)
*items items to insert at start index
Returns a new list of removed items (or an empty list)
"""
if delete_count == None:
delete_count = len(target) - start
# store removed range in a separate list and replace with *items
total = start + delete_count
removed = target[start:total]
target[start:total] = items
return removed
Ответ 5
Если l
- ваш список, а X
- ваше значение:
for i in range(len(l) + 1):
print l[:i] + [X] + l[i:]
Ответ 6
Простейшим является список использования [i: i]
a = [1,2, 3, 4]
a[2:2] = [10]
Печать a для проверки вставки
print a
[1, 2, 10, 3, 4]