缩略字典PYTHON

缩略字典PYTHON,python,Python,我想制作一本字典,将字母表中的每个字母都设置为数字值,例如a:1 alphabet = dict([ (chr(97+i), i+1) for i in range(0, 26) ]) 然而,一旦它到达z,我需要它的字母循环一次,但值必须继续从26,例如z:26,a:27,b:28等。如果不手动编写词典,我将如何做到这一点 字典不能有指向不同值的重复键,因此d={'A':1,'A':27}不起作用。但是,您可以将其反转,使键变为您的数字。。。类似这样的方法会奏效: import string

我想制作一本字典,将字母表中的每个字母都设置为数字值,例如a:1

alphabet = dict([ (chr(97+i), i+1) for i in range(0, 26) ])

然而,一旦它到达z,我需要它的字母循环一次,但值必须继续从26,例如z:26,a:27,b:28等。如果不手动编写词典,我将如何做到这一点

字典不能有指向不同值的重复键,因此
d={'A':1,'A':27}
不起作用。但是,您可以将其反转,使键变为您的数字。。。类似这样的方法会奏效:

import string

d = {}

for i, l in enumerate(string.ascii_lowercase):
    d[i+1] = l
    d[i+27] = l
结果:

{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z', 27: 'a', 28: 'b', 29: 'c', 30: 'd', 31: 'e', 32: 'f', 33: 'g', 34: 'h', 35: 'i', 36: 'j', 37: 'k', 38: 'l', 39: 'm', 40: 'n', 41: 'o', 42: 'p', 43: 'q', 44: 'r', 45: 's', 46: 't', 47: 'u', 48: 'v', 49: 'w', 50: 'x', 51: 'y', 52: 'z'}

你不是真的想这么做,你只是认为你想这么做!字典不能有重复的键,这实际上是不可能的

>>> d = {'a': 1, ..., 'a':27}  # doesn't work the way you think it does!
>>> d
{'a': 27}  # where'd the a->1 mapping go!
相反,您应该编写一个执行查找的函数,并使用模运算符
%
来“包装”范围

def char_lookup(ord_):
    """Maps 1->a, 2->b, etc. Handles 27->a, 28->b, ..."""
    OFFSET = 97
    return chr((ord_-1) % 26 + OFFSET)
然后,不要执行
d[27]
并获取
'a'
,而是执行
char\u查找(27)

正如Lattyware在评论中指出的那样,您可能试图获得给定字符的值范围,而不是给定值范围的字符。在这种情况下,您可以执行以下操作:

import string
d = {ch:[i, i+26] for i,ch in enumerate(string.ascii_lowercase, start=1)}
def alphabet(i):
    i = i%26
    return chr(97+i)
d
然后看起来像:

{'a': [1, 27], 'b': [2, 28], ...}

如果你想要一个“循环”的东西,也就是说,在你通过26(或25,如果你从0开始)之后,你需要的不是一个字典,而是一个函数(因为正如注释中所指出的,python字典不能有重复的键)。因此,请尝试以下方法:

import string
d = {ch:[i, i+26] for i,ch in enumerate(string.ascii_lowercase, start=1)}
def alphabet(i):
    i = i%26
    return chr(97+i)
您可以使用以下简单循环来测试这一点:

for i in range(200):
    print(alphabet(i))

这是实现您需要的另一种方式:

a = 'abcdefghijklmnopqrstuvwxyz'
b = list(range(1,53))
c = [x for x in a*2]
d = dict(zip(b,c))
d的输出

{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j', 11: 'k', 12: 'l', 13: 'm', 14: 'n', 15: 'o', 16: 'p', 17: 'q', 18: 'r', 19: 's', 20: 't', 21: 'u', 22: 'v', 23: 'w', 24: 'x', 25: 'y', 26: 'z', 27: 'a', 28: 'b', 29: 'c', 30: 'd', 31: 'e', 32: 'f', 33: 'g', 34: 'h', 35: 'i', 36: 'j', 37: 'k', 38: 'l', 39: 'm', 40: 'n', 41: 'o', 42: 'p', 43: 'q', 44: 'r', 45: 's', 46: 't', 47: 'u', 48: 'v', 49: 'w', 50: 'x', 51: 'y', 52: 'z'}

为了完整性,由于没有人给出保留关键价值角色的答案,我举了一个这样的例子

同一个键不可能有多个值,但是,您可以将一组值作为值,用于模拟每个键的多个值:

>>> alphabet = {chr(i + 97): itertools.count(i + 1, 26) for i in range(0, 26)}
>>> a = alphabet["a"]
>>> next(a)
1
>>> next(a)
27
在这里,我使用的是字典理解,因为它更易于阅读-如果您使用的是非常旧的Python版本,您可能需要使用:

dict((chr(i + 97), itertools.count(i + 1, 26)) for i in range(0, 26))

不能同时有“a”:1和“a”:27的条目,这会使字母表['a']模糊不清。我误解了吗?字典不能有重复的键,所以
{'A':1,'b':2,'z':26,'A':27,'b':28,}
是不可能的。或者您想要
{1:a',2:b',27:a',28:b'}
?那很好。请解释你的目标,可能有一条捷径。这是原始海报想要的字典的反面。@Lattyware如前所述,字典不能有重复的键,所以这是下一个最好的选择。是吗?这在很大程度上取决于用例。至少应该在你的回答中提到这是一个替代方案,并解释其区别。值得注意的是,这与问题中所示的相反。这可能对询问者有效,但这是一个重要的区别。@Lattyware不相关,因为问题中显示的映射是不可能的。这似乎完成了OP想要的唯一合理的查找。不可能?您可以拥有到值列表的映射。您已经对询问者想要什么做了(合理的)假设,但这不是唯一可能的答案,而且根据用例的不同,它可能完全无用。您应该清楚地说明什么时候做出这样的假设。@Lattyware问题中显示的映射是
{'a':1,,'a':27}
,这当然是胡说八道<代码>{'a':[1,27]}
显然是可能的,但与我建议的答案“不匹配”的问题相同。我的观点不是你的答案不好,或者另一个更好,只是由于问题的性质(它要求不可能的东西),有多个潜在的答案,你应该弄清楚你的和别人要求的有什么不同。