在python中

时间:2018-03-04 22:36:56

标签: python dictionary

更大的问题在于:我正在分解20个扇区中的一个圆圈,以找到坐标落在哪里找到它们的飞镖棋盘游戏的价值。有20个值1-20不按顺序排列。飞镖板值沿圆圈下降:

enter image description here

我目前有一个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问题。

5 个答案:

答案 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