缩短词典PYTHON

时间:2015-06-15 15:40:30

标签: python

我希望制作一个字典,将字母表中的每个字母设置为其数字值,例如a:1就像这样。

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

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

5 个答案:

答案 0 :(得分:2)

你真的不想这样做,你只是觉得你这样做!字典不能有重复键,这实际上是不可能的。

>>> 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_lookup(27)

正如Lattyware在评论中指出的那样,你可能会尝试获得给定角色的一系列值,而不是给出一系列值的角色。在这种情况下,您可以执行以下操作:

import string
d = {ch:[i, i+26] for i,ch in enumerate(string.ascii_lowercase, start=1)}

d然后看起来像:

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

答案 1 :(得分:1)

为了完整起见,由于没有人给出保留键值角色的答案,我举一个例子。

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

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

答案 2 :(得分:0)

字典不能有指向不同值的重复键,因此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'}

答案 3 :(得分:0)

如果你想要'循环'的东西,即你从传递26后再次开始(或25,如果你从0开始),那么你需要的不是字典而是函数(因为在评论中指出) ,python词典不能有重复的键)。所以尝试类似的事情:

def alphabet(i):
    i = i%26
    return chr(97+i)

你可以用这个简单的循环来测试它:

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

答案 4 :(得分:0)

这是实现所需目标的另一种方式:

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'}