2012-03-19 8 views
1

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

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

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

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] 

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

+0

Я хотел бы использовать индексирование, потому что это должно использоваться в функции. –

+0

Это не решает вопрос об автоответчике о динамическом поиске последнего индекса «xx» – alonisser

+0

@CodeBisector Я добавил, как найти индекс. – agf

0

Попробуйте циклически с

for item in items_to_be_moved: 
    # Add items one at a time 
0

На второй теме:

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

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... 

или реверса список на месте делать то index-thing отменит его назад и переделает позицию.

list3.reverse() 
pos = list3.index('XX') 
list3.reverse() 
pos = len(list3) - pos - 1 
1

Во-первых, вот как find the last index. Но будьте осторожны, если вы получите индексный номер последней копии 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

Выполнение назначения среза по старым значениям выполняется быстро, потому что вам не нужно изменять размер списка и перемещать значения. Ваш метод заставляет вас перемещать все значения после этой точки в списке дважды. Связанный метод поиска последнего индекса также требует, чтобы вы сделали копию списка и перебирали весь список, что не обязательно. – agf

+0

Похоже, он хотел, чтобы новый (выходной) список был больше, а не перезаписан. Это немного запутанно, потому что у его образца ввода 'list3' есть десять элементов, а у его вывода выборки 11, что не соответствует ни чистой вставке, ни чистой записи. (Я удивлен, что метод «пошаговый-один срез» не является специальным, заключенным внутри Python. Тем не менее, как я уже отметил, существует опасность взять вещи, которые не являются XX, но окружены маркерами XX. Ваш «takewhile» 'является очевидным правильным способом получить смежные элементы XX, тем более, что' itertools', как правило, очень быстр.) – torek

+0

Gah, я вернулся и перечитал входы, выходы и проблемы, и я совершенно не прав, он сделал скажем, «перезаписать». – torek

2

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

list[count-1:count+2] 

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

0

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

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

Это именно то, что я хотел. большое спасибо. –

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