如何从列表中仅移除一个随机重复元素并提取至另一个列表?
问题
需要从含重复元素的列表中随机选取一个元素,提取到另一个列表,同时原列表仅移除该元素。示例:原列表[1, 1, 1, 1, 2, 2, 2, 2]操作后变为[1, 1, 1, 2, 2, 2, 2],提取列表为[1]。
尝试的代码如下:
import random card_list = [11, 11, 11, 11, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,] player = [] dealer = [] popped = [] choice = random.choice(card_list) popped = card_list.pop(choice) player.append(popped) print(player) print(card_list)
但这段代码只能选取11、2或3,无法正常随机选取所有元素,希望用pop()实现需求。
解决方法
问题出在list.pop()的参数使用错误:pop()需要传入索引位置,而非元素值。你用random.choice(card_list)拿到的是列表里的元素值(比如10),把这个值传给pop(),它会当成索引去取元素,逻辑完全错误——比如当元素值是10时,实际取的是索引10的元素(也就是3),而非值为10的元素。
要实现需求,应该先随机生成一个合法的索引,再用pop()移除该索引对应的元素:
import random card_list = [11, 11, 11, 11, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,] player = [] dealer = [] # 生成0到列表长度-1之间的随机索引 random_index = random.randint(0, len(card_list)-1) # 移除该索引对应的元素并赋值 popped = card_list.pop(random_index) player.append(popped) print(player) print(card_list)
这段代码会随机选中列表里的任意一个元素,将其移到player列表,同时原列表card_list仅移除被选中的元素,完全符合需求。
内容的提问来源于stack exchange,提问作者Frqim
相关产品推荐
相关产品推荐

