映射整数到python中的dict键的列表

问题描述 投票:-2回答:5

更大的问题在于:我正在分解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(Red Hat 4.4.7-1)]'

我相信最有效的解决方案是将范围映射到飞镖板值作为键。 @jpp我对更有效的解决方案持开放态度,而不是创建XY问题。

python dictionary
5个回答
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

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
投票

编辑问题:

知道怎么做:

{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)])

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}

-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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.