我正在製作一本詞典,將字母表中的每個字母都設置爲其數值,例如a:1。縮寫詞典PYTHON
alphabet = dict([ (chr(97+i), i+1) for i in range(0, 26) ])
但是一旦它到Z我需要它的字母來循環一次以上,但該值必須從26繼續例如Z:26,:27,B:28等。如果不手動寫出字典,我該怎麼做?
我正在製作一本詞典,將字母表中的每個字母都設置爲其數值,例如a:1。縮寫詞典PYTHON
alphabet = dict([ (chr(97+i), i+1) for i in range(0, 26) ])
但是一旦它到Z我需要它的字母來循環一次以上,但該值必須從26繼續例如Z:26,: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'}
這是原始海報想要的字典的反面。 –
@Lattyware如前所述,字典不能有重複的鍵,所以這是下一個最好的選擇。 – Jkdc
這是?這在很大程度上取決於用例。在你的回答中至少應該提到這是一種替代方案,並解釋其中的差異。 –
你實際上並不想這樣做,你只要想你呢!字典不能有重複的鍵,這實際上是不可能的。
>>> 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], ...}
值得注意的是,這與問題中顯示的映射做了相反的映射。這可能對提問者有用,但這是一個重要的區別。 –
@Lattyware無關緊要,因爲問題中顯示的映射是不可能的。這似乎完成了OP可能需要的唯一合理的查找。 –
不可能嗎?您可以將地圖映射到值列表。你對提問者想要的東西做了一個(合理的)假設,但這不是唯一可能的答案,根據使用情況它可能完全無用。你應該清楚地陳述你做出這樣的假設。 –
如果你想要的東西,「週期」,即再從你通過26(或25後開始,如果你從0開始),那麼你需要的不是一個字典,而是一個函數(因爲正如註釋中指出的那樣,python字典不能有重複的鍵)。因此,嘗試這樣的:
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'一個':27,同時,這將使字母['a']不明確。我誤解了嗎? – camz
字典不能有重複的鍵,所以'{'a':1,'b':2,...'z':26,'a':27,'b':28,...} '是不可能的。或者你想要'{1:'a',2:'b',... 27:'a',28:'b'}'?那很好。 – Kevin
請解釋你的目標,可能有一個捷徑。 –