在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的东西是有危险的