我想将多个项目从一个列表移动到另一个列表。
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'], ' ', ' ']"
应该退回。
答案 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]