Вставка значений в определенные места в списке в Python - PullRequest
37 голосов
/ 07 февраля 2010

Я пытаюсь распечатать все возможные результаты данного списка, и мне было интересно, как поместить значение в различные места в списке. Например, если мой список был [A,B], я хочу вставить X во все возможные индексы списка, чтобы он возвращал [X,A,B], [A,X,B], [A,B,X].

Я думал об использовании range(len()) и цикле for, но не знал, с чего начать.

Ответы [ 7 ]

82 голосов
/ 08 февраля 2010

Используйте 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')
21 голосов
/ 07 февраля 2010

Вы можете сделать это со следующим пониманием списка:

[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']]
4 голосов
/ 12 октября 2012

Если вы хотите вставить список в список, вы можете сделать это:

>>> 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]
1 голос
/ 05 апреля 2017

Простейшим является список использования [i: i]

    a = [1,2, 3, 4]
    a[2:2] = [10]

Распечатать для проверки вставки

    print a
    [1, 2, 10, 3, 4]
0 голосов
/ 14 июня 2018

Попробуйте этот фрагмент кода:

for x in range(3):
    l=['A', 'B']
    l.insert(x, 'X')
    print(l)

Выход:

['X', 'A', 'B']
['A', 'X', 'B']
['A', 'B', 'X']
0 голосов
/ 29 марта 2017

Исходя из 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
0 голосов
/ 07 февраля 2010

Если l - ваш список, а X - ваше значение:

for i in range(len(l) + 1):
    print l[:i] + [X] + l[i:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...