如何在Python中将多个项目从一个列表移动到另一个列表

时间:2012-03-19 21:15:39

标签: python list indexing

我想将多个项目从一个列表移动到另一个列表。

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

在上面的代码中,' '是一个双倍空格

我希望能够将'5D','4S','3D'list2移到'8C','7H','6C'的{​​{1}}。

我已经尝试过以下代码,但它不起作用。

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'], '  ', '  ']"

应该退回。

6 个答案:

答案 0 :(得分: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]

找到最后一个索引。

答案 1 :(得分:2)

如果所有'xx'总是在需要之前有另一种方式(除了@turek建议的那个)使用'list.count('xx')'和切片:

list[count-1:count+2]

您可以使用切片运算符来执行插入操作,我可能会按照@ intra-c

的建议进行迭代

答案 2 :(得分: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从list2中删除,也可以只分配给切片:

>>> list2[2:5] = []
>>> list2
['XX', 'XX', '  ', '  ', '  ', '  ']

答案 3 :(得分:0)

尝试使用

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

答案 4 :(得分: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

答案 5 :(得分: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]