Python:如何将列表非连续值分配到字典各键(每键4个值)
问题:实现非连续值的字典分配
现有列表 l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],以及包含3个空列表的字典:
sample = { "A": [], "B": [], "C": [], }
需要将列表值分配到字典的每个键对应的列表中,要求:
- 每个键对应的列表包含4个值
- 列表内的值不能连续(例如
{"A": [1,3,5,7], "B": [2,10,12,8], "C": [4,11,9,6]}符合要求) - 值可随机排序,但必须全部来自原列表
当前实现代码会按顺序分配连续值,具体代码及输出如下:
overs = [] # Creates a list with values from 1 to 12 for i in range(1, 13): overs.append(i) print(overs) players = {"A": [], "B": [], "C": []} # Creates a dictionary where the values of the list are inserted into the values of the dictionary for player in players: for i in range(1, 13): try: if len(players[player]) < 4: players[player].append(overs[0]) overs.pop(0) except IndexError: break print(players)
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] {'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8], 'C': [9, 10, 11, 12]}
解决方案
原代码问题分析
原代码通过循环逐个从列表头部取出元素填充每个玩家的列表,导致每个玩家拿到的都是连续的一段数值,完全不符合非连续的要求。
改进思路
核心是破坏原列表的数值连续性,再进行分配:
- 先随机打乱原列表的顺序,让数值的连续关系被打破
- 按每个玩家4个元素的规则分配打乱后的列表,确保每个玩家的列表内不会出现连续数值
实现代码
方法1:打乱后直接切片分配(简洁高效)
import random # 生成初始列表 overs = list(range(1, 13)) # 随机打乱列表顺序,破坏连续性 random.shuffle(overs) players = {"A": [], "B": [], "C": []} # 按每个玩家4个元素分配 players["A"] = overs[:4] players["B"] = overs[4:8] players["C"] = overs[8:] print(players)
示例输出(每次运行结果随机):
{'A': [3, 1, 7, 5], 'B': [12, 2, 8, 10], 'C': [4, 11, 6, 9]}
方法2:轮流分配(进一步避免潜在连续)
如果担心切片分配仍有极小概率出现连续值(实际打乱后概率极低),可以采用轮流给每个玩家分配元素的方式:
import random overs = list(range(1, 13)) random.shuffle(overs) players = {"A": [], "B": [], "C": []} # 轮流给每个玩家添加元素,直到每个玩家有4个值 while any(len(lst) < 4 for lst in players.values()): for player in players: if len(players[player]) < 4 and overs: players[player].append(overs.pop()) print(players)
示例输出:
{'A': [9, 2, 11, 7], 'B': [5, 12, 4, 1], 'C': [8, 3, 10, 6]}
内容的提问来源于stack exchange,提问作者Gwent23
相关产品推荐
相关产品推荐

