Как я могу переместить более одного элемента из одного списка в другой в Python - PullRequest
1 голос
/ 20 марта 2012

Я хотел бы переместить более одного элемента из одного списка в другой.

list1 = ['2D','  ','  ','  ','  ','  ','  ','  ','  ']
list2 = ['XX','XX','5D','4S','3D','  ','  ','  ','  ']
list3 = ['XX','XX','XX','8C','7H','6C','  ','  ','  ']

В приведенном выше коде ' ' это двойной пробел

Я бы хотел иметь возможность переместить '5D','4S','3D' с list2 на '8C','7H','6C' в list3.

Я пробовал код ниже, но он не работает.

list1 = ['2D','  ','  ','  ','  ','  ','  ','  ','  ']
list2 = ['XX','XX','5D','4S','3D','  ','  ','  ','  ']
list3 = ['XX','XX','XX','8C','7H','6C','  ','  ','  ']


items_to_be_moved = list2[list2.index('XX')+2 : list2.index('  ')]

list3[list3.index('  ')] = items_to_be_moved
del list2[list2.index('XX')+2 : list2.index('  ')]

print('list2',list2)
print('list3',list3)

и это возвращает

list2 ['XX', 'XX', '  ', '  ', '  ', '  ']
list3 ['XX', 'XX', 'XX', '8C', '7H', '6C', ['5D', '4S', '3D'], '  ', '  ']

Однако я не хочу использовать list2.index('XX')+2, я хотел бы использовать код, который дает последний индекс 'XX', так же как list2.index(' ') дает первый индекс ' '.

Кроме того, я не хочу, чтобы перемещенные элементы находились в отдельном собственном списке в другом списке. Например: вместо возврата

"list3 ['XX', 'XX', 'XX', '8C', '7H', '6C', ['5D', '4S', '3D'], '  ', '  ']"

список

"list3 ['XX', 'XX', 'XX', '8C', '7H', '6C','5D', '4S', '3D', '  ', '  ']"

должны быть возвращены.

Ответы [ 6 ]

6 голосов
/ 20 марта 2012

Чтобы заменить правильные элементы, используйте назначение среза.

list1 = ['2D','  ','  ','  ','  ','  ','  ','  ','  ']
list2 = ['XX','XX','5D','4S','3D','  ','  ','  ','  ']
list3 = ['XX','XX','XX','8C','7H','6C','  ','  ','  ']

list3[3:6] = list2[2:5]

print list3
# ['XX', 'XX', 'XX', '5D', '4S', '3D', '  ', '  ', '  ']

Если вы хотите начать после последнего последовательного 'XX', вы можете использовать:

from itertools import takewhile
i = sum(1 for _ in takewhile(lambda elem: elem == 'XX', list3))

list3[i:i+3] = list2[i-1:i+2]

длянайти индекс последнего.

2 голосов
/ 20 марта 2012

хорошо, если все 'xx' всегда перед необходимыми, есть другой способ (кроме предложенного @turek) с использованием 'list.count (' xx ')' и нарезки:

list[count-1:count+2]

вы можете использовать оператор слайса для вставки, и я бы, вероятно, повторил, как предложено @ intra-c

1 голос
/ 20 марта 2012

Во-первых, вот как найти последний индекс . Но будьте осторожны, если вы получите порядковый номер последней копии XX, что если список прочтет, например, ['XX', '1D', 'XX', '4S'], чтобы в середине находился действительный элемент?

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

>>> list2[2:5]
['5D', '4S', '3D']
>>> list3[6:6] = list2[2:5]
>>> list3
['XX', 'XX', 'XX', '8C', '7H', '6C', '5D', '4S', '3D', '  ', '  ', '  ']

Вы можете использовать del для удаления из списка2, или вы можете просто назначить слайсу:

>>> list2[2:5] = []
>>> list2
['XX', 'XX', '  ', '  ', '  ', '  ']
0 голосов
/ 20 марта 2012

Не забудьте про отрицательные индексы для нарезки с конца:

i2_begin = -list2[::-1].index('XX')
i2_end = list2.index('  ')
i3 = list3.index('  ')

list3[i3:i3] = list2[i2_begin:i2_end]
del list2[i2_begin:i2_end]
0 голосов
/ 20 марта 2012

По второй теме:

Не думаю, что есть функция для нахождения последнего вхождения в списках, но вы можете сделать цикл

pos = 0
while 1:
    try:
        pos = list3.index('XX',pos+1)
    except ValueError:
        break
if pos == 0 and list3[0] != 'XX':
    #Do something to pos if there was no XX in list...

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

list3.reverse()
pos = list3.index('XX')
list3.reverse()
pos = len(list3) - pos - 1
0 голосов
/ 20 марта 2012

Попробуйте выполнить цикл с

for item in items_to_be_moved:
    # Add items one at a time
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...