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

在Python中,如何将多个项目从一个列表移动到另一个列表,python,list,indexing,Python,List,Indexing,我想将多个项目从一个列表移动到另一个列表 list1 = ['2D',' ',' ',' ',' ',' ',' ',' ',' '] list2 = ['XX','XX','5D','4S','3D',' ',' ',' ',' '] list3 = ['XX','XX','XX','8C','7H','6C',' ',' ',' '] 在上面的代码中,“是一个双空格 我希望能够将'5D'、'4S'、'3D'从列表2移动到列表3中的'8C'、'7H'、'6C'

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

list1 = ['2D','  ','  ','  ','  ','  ','  ','  ','  ']
list2 = ['XX','XX','5D','4S','3D','  ','  ','  ','  ']
list3 = ['XX','XX','XX','8C','7H','6C','  ','  ','  ']
在上面的代码中,
是一个双空格

我希望能够将
'5D'、'4S'、'3D'
列表2
移动到
列表3
中的
'8C'、'7H'、'6C'

我已经尝试了下面的代码,但不起作用

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

应返回。

尝试使用循环

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

试着用

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

要替换正确的项目,请使用切片分配

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]

要查找最后一个项目的索引。

要替换正确的项目,请使用切片分配

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]
查找最后一个主题的索引。

关于第二个主题:

不要认为有一个函数可以查找列表中的最后一个事件,但您可以执行循环

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
关于第二个议题:

不要认为有一个函数可以查找列表中的最后一个事件,但您可以执行循环

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
首先,这里有一些方法。但是当心,如果你得到了最后一个拷贝的索引号<代码> XX < /代码>,如果列表读了,例如,<代码> [1x','1x','x','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', '  ', '  ', '  ', '  ']
首先,这里有一些方法。但是当心,如果你得到了最后一个拷贝的索引号<代码> XX < /代码>,如果列表读了,例如,<代码> [1x','1x','x','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', '  ', '  ', '  ', '  ']

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

list[count-1:count+2]

您可以使用slice操作符进行插入,我可能会像@intra-c所建议的那样进行迭代,如果所有的'xx'总是在需要的之前,那么还有另一种方法(除了@turek所建议的方法)使用'list.count('xx')和切片:

list[count-1:count+2]

您可以使用slice操作符进行插入,我可能会像@intra-c所建议的那样迭代。不要忘记从末尾开始切片的负索引:

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]

不要忘记从末尾进行切片时的负索引:

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]

我想使用索引,因为这是在函数中使用的。这并不能解决询问者关于动态查找最后一个“xx”的问题index@CodeBisector我已经添加了如何找到索引。使用itertools的很好的一个,而且我认为@turek建议更有用pythonic@alonisser见我对他的回答的评论。这可能并不重要,但如果没有必要,我不想复制列表。我想使用索引,因为这将在函数中使用。这并不能解决询问者关于动态查找最后一个“xx”的问题index@CodeBisector我已经添加了如何找到索引。使用itertools的很好的一个,而且我认为@turek建议更有用pythonic@alonisser见我对他的回答的评论。这可能并不重要,但我不喜欢在没有必要的情况下复制列表。在旧值上直接进行切片赋值很快,因为不必调整列表大小和移动值。您的方法使您将列表中该点之后的所有值移动两次。查找最后一个索引的链接方法还要求您复制列表,并迭代整个列表,这是不必要的。听起来他希望新的(输出)列表更大,而不是被覆盖。这有点让人困惑,因为他的示例输入
list3
有10项,而他的示例输出有11项,这与纯插入或纯覆盖都不匹配。(我很惊讶,在Python中,单步负一片方法并不是特例。不过,正如我所指出的,使用非XX但被XX标记包围的东西是有危险的。您的
takewhile
显然是获取连续XX项的正确方法,特别是因为
itertools
通常非常快。),我回去重新阅读了输入、输出和问题,我完全错了,他说“覆盖”。在旧值上进行切片赋值很快,因为不必调整列表大小和移动值。您的方法使您将列表中该点之后的所有值移动两次。查找最后一个索引的链接方法还要求您复制列表,并迭代整个列表,这是不必要的。听起来他希望新的(输出)列表更大,而不是被覆盖。这有点让人困惑,因为他的示例输入
list3
有10项,而他的示例输出有11项,这与纯插入或纯覆盖都不匹配。(我很惊讶,在Python中,step by negative one-slice方法并不是特例。不过,正如我所指出的,使用非XX而是surr的东西是有危险的