如何创建键值数量不同的定制字典?每两个键对应一个值
问题:将列表中每两个元素映射到另一个列表的对应元素创建字典
我有两个列表:
k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] v = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
希望创建如下形式的字典:
d = {0:'1', 1:'1', 2:'2', 3:'2', 4:'3', 5:'3', ...}
即列表k中每两个连续元素依次映射到列表v中的同一个元素,请问该如何实现?
方法1:字典推导式(简洁高效)
通过遍历v的索引和值,为每个v元素匹配k中对应的两个键,一行代码完成:
k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] v = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] d = {key: val for idx, val in enumerate(v) for key in k[2*idx : 2*(idx+1)]}
逻辑说明:enumerate(v)获取v中每个元素的索引和值,k[2*idx : 2*(idx+1)]截取k中对应位置的两个元素,最终将这两个元素都映射到当前v的值。
方法2:显式循环构建(可读性强)
如果偏好更直白的逻辑,可以用循环逐个添加键值对:
d = {} for idx in range(len(v)): # 取出k中对应的两个键 key_a = k[2*idx] key_b = k[2*idx + 1] d[key_a] = v[idx] d[key_b] = v[idx]
这种方式步骤清晰,适合理解基础逻辑。
方法3:迭代器分组(进阶场景)
如果k是动态生成的序列(比如用range生成),可以用迭代器分组的方式配对k和v:
Python 3.12+版本
import itertools k = range(20) # 等价于原列表 v = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] d = {} for keys, val in zip(itertools.batched(k, 2), v): for key in keys: d[key] = val
低版本Python兼容写法
k = range(20) v = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] d = {} for keys, val in zip(zip(*[iter(k)]*2), v): for key in keys: d[key] = val
这里zip(*[iter(k)]*2)的作用是将k按每两个元素一组拆分,和v一一配对后再构建字典。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

