更大的问题在于:我正在分解20个扇区中的一个圆圈,以找到坐标落在哪里找到它们的飞镖棋盘游戏的价值。有20个值1-20不按顺序排列。飞镖板值沿圆圈下降:
我目前有一个thetas列表(学位范围)[(0-18),(18-36),(36-54)...]
我试图将thetas列表映射到飞镖板的每个扇区,这些扇区对应不同的值,而不是按顺序。
飞镖靶值列表如下:
darts_list = [20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5]
知道如何获得:
{20: (0-18), 1: (18-36), 18: (36-54)...}
所以我可以将theta的范围映射到dict值。提前谢谢!
修改 我认为我正在寻找的东西有些混乱,我不想要0作为dict值,所以我改为我正在寻找的东西。
Python版本:' 3.4.5 | Anaconda自定义(64位)| (默认,2016年7月2日,17:47:47)\ n [GCC 4.4.7 20120313(红帽4.4.7-1)]'
我认为最有效的解决方案是将范围映射到飞镖板值作为键。 @jpp我对更高效的解决方案持开放态度,而不是创建XY问题。
答案 0 :(得分:1)
在Python 3.6之前dict
是无序的。从Python 3.7开始,dict
被命令是一种语言特征。
无序意味着dict
中存储的内容不能保证以与添加时相同的顺序存储。所以通常的解决方案是使用collections.OrderedDict
:
from collections import OrderedDict
darts_list = [20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5]
od = OrderedDict((x, 0) for x in darts_list)
答案 1 :(得分:1)
已修改的问题:
知道如何获得:
{20: (0-18), 1: (18-36), 18: (36-54)...}
答案:
使用dict()
创建一个新词典并压缩您的键和值:
>>> dict(zip(darts_list, theta_ranges)))
{20: (0, 18), 1: (18, 36), 18: (36, 54), 4: (54, 72), ...
如果您使用Python< = 3.6并想要订单,这也适用于OrderedDict
:
>>> OrderedDict(zip(darts_list, theta_ranges))
OrderedDict([(20, (0, 18)),
(1, (18, 36)),
(18, (36, 54)),
(4, (54, 72)), ...
旧问题:
知道如何获得:
{20: 0, 1: 0, 18: 0...}
答案:
由于所有密钥的值均为0
,因此您可以使用fromkeys()
方法:
返回一个新的dict,其中包含来自iterable的键,值等于value。
Python> = 3.6(有序的dicts)
>>> dict.fromkeys(darts_list, 0)
{20: 0, 1: 0, 18: 0, 4: 0, 13: 0, 6: 0, 10: 0, 15: 0, 2: 0, 17: 0, 3: 0, 19: 0, 7: 0, 16: 0, 8: 0, 11: 0, 14: 0, 9: 0, 12: 0, 5: 0}
Python< 3.6
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys(darts_list, 0)
OrderedDict([(20, 0), (1, 0), (18, 0), (4, 0), (13, 0), (6, 0), (10, 0), (15, 0), (2, 0), (17, 0), (3, 0), (19, 0), (7, 0), (16, 0), (8, 0), (11, 0), (14, 0), (9, 0), (12, 0), (5, 0)])
答案 2 :(得分:0)
简单的词典理解。
仅在python 3.6中。正如@Alex指出的那样,如果使用3.6以下的python,请使用OrdereDict。
darts = {k: 0 for k in darts_list}
{20: 0, 1: 0, 18: 0, 4: 0, 13: 0, 6: 0, 10: 0, 15: 0, 2: 0, 17: 0, 3: 0, 19: 0, 7: 0, 16: 0, 8: 0, 11: 0, 14: 0, 9: 0, 12: 0, 5: 0}
答案 3 :(得分:0)
这似乎是XY problem。
鉴于您不清楚为什么需要OrderedDict
,我提出了一个有效地将飞镖板映射到角度范围的解决方案。
darts_list = [20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5]
theta_ranges = ((n*18, (n+1)*18) for n in range(20))
d = dict(zip(darts_list, theta_ranges))
# {20: (0, 18), 1: (18, 36), 18: (36, 54), 4: (54, 72),
# 13: (72, 90), 6: (90, 108), 10: (108, 126),
# 15: (126, 144), 2: (144, 162), 17: (162, 180),
# 3: (180, 198), 19: (198, 216), 7: (216, 234),
# 16: (234, 252), 8: (252, 270), 11: (270, 288),
# 14: (288, 306), 9: (306, 324), 12: (324, 342), 5: (342, 360)}
如果您需要通过字典映射范围,还可以考虑将dict
子类化并将范围映射到值:
class dict_range(dict):
def __getitem__(self, value):
key = next((k for k in self.keys() if k[0] <= value < k[1]), None)
return self.get(key) if key else None
d = dict_range(dict(zip(theta_ranges, darts_list)))
d[15] # 20, i.e. 15 degrees value = 20
d[275] # 11, i.e. 275 degrees value = 11
d[375] # None
答案 4 :(得分:-1)
darts_list = [20,1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5]
d=dict()
for c in darts_list:
d[c]=0