将字符串中的每个字符转换为字典键

Posted

技术标签:

【中文标题】将字符串中的每个字符转换为字典键【英文标题】:Convert every character in a String to a Dictionary Key 【发布时间】:2015-12-25 06:55:38 【问题描述】:

假设我有一个字符串"abcdefghijklmnopqrstuvwxyz"并且我想用这些值初始化字典键。

alphabet = 'abcdefghijklmnopqrstuvwxyz'

alphabetDict = dict()
for char in alphabet:
    alphabetDict[char] = 0

有没有更好的方法?

【问题讨论】:

***.com/questions/1747817/… 【参考方案1】:

你可以使用dict.fromkeys()方法-

>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> alphaDict = dict.fromkeys(s,0)
>>> alphaDict
'm': 0, 'p': 0, 'i': 0, 'n': 0, 'd': 0, 'w': 0, 'k': 0, 'y': 0, 's': 0, 'b': 0, 'h': 0, 't': 0, 'u': 0, 'q': 0, 'g': 0, 'l': 0, 'e': 0, 'a': 0, 'j': 0, 'c': 0, 'o': 0, 'f': 0, 'v': 0, 'x': 0, 'z': 0, 'r': 0

来自documentation -

fromkeys(seq[, value])

使用来自 seq 的键和设置为 value 的值创建一个新字典。

fromkeys() 是一个返回新字典的类方法。值默认为None

请注意,如果 value 是可变的,例如 list 或另一个 dict 等,则不应使用此值。因为该值仅在您调用方法 fromkeys() 时评估一次,并且所有关键点到同一个对象。

您可以将其用于不可变类型作为值,例如 intstr 等。


另外,您不需要指定 salphabet 字符串,您可以使用 string.ascii_lowercase 代替。示例 -

>>> import string
>>> alphaDict = dict.fromkeys(string.ascii_lowercase,0)
>>> alphaDict
'm': 0, 'p': 0, 'i': 0, 'n': 0, 'd': 0, 'w': 0, 'k': 0, 'y': 0, 's': 0, 'b': 0, 'h': 0, 't': 0, 'u': 0, 'q': 0, 'g': 0, 'l': 0, 'e': 0, 'a': 0, 'j': 0, 'c': 0, 'o': 0, 'f': 0, 'v': 0, 'x': 0, 'z': 0, 'r': 0

【讨论】:

【参考方案2】:

您可以在 Python 中使用字典推导式。

alphabetDict = char: 0 for char in alphabet

Dictionaries(Python 文档)

此答案与上述 Anand 的答案之间存在细微差别。字典推导评估每个键的值,而 fromkeys 只做一次。如果您使用的是整数之类的东西,这没有问题。但是,如果你这样做

d = key: [] for key in <some set>
d[3].append(5)
print(d[2])

给你

[]

你有不同的列表,而

d = dict.fromkeys(<some set>, [])
d[3].append(5)
print(d[2])

给你

[5]

将所有键映射到同一个列表。

【讨论】:

【参考方案3】:

是的,您可以使用dictionary comprehensions. 在一行中完成此操作

In [1]: alphabet = 'abcdefghijklmnopqrstuvwxyz'

In [2]: x:0 for x in alphabet # dictionary comprehension
Out[2]: 
'a': 0,
 'b': 0,
 'c': 0,
 'd': 0,
 'e': 0,
 'f': 0,
 'g': 0,
 'h': 0,
 'i': 0,
 'j': 0,
 'k': 0,
 'l': 0,
 'm': 0,
 'n': 0,
 'o': 0,
 'p': 0,
 'q': 0,
 'r': 0,
 's': 0,
 't': 0,
 'u': 0,
 'v': 0,
 'w': 0,
 'x': 0,
 'y': 0,
 'z': 0

【讨论】:

【参考方案4】:

尝试了另一种方法。

dict(zip(alphabets, '0'*len(alphabets)))

【讨论】:

【参考方案5】:

如果您需要一个具有不同值而不是常量值的字典,您可以使用 random 模块创建一个如下所示的字典:

>>> import random
>>> alphabet = 'abcdefghijklmnopqrstuvwxyz'
>>> my_dict = dict([ (ch, random.randint(1,len(alphabet)) ) for ch in alphabet ]  )
>>> my_dict
'a': 17, 'b': 15, 'c': 3, 'd': 5, 'e': 5, 'f': 13, 'g': 7, 'h': 1, 'i': 3, 'j': 12, 'k': 11, 'l': 7, 'm': 8, 'n': 23, 'o': 15, 'p': 7, 'q': 9, 'r': 19, 's': 17, 't': 22, 'u': 20, 'v': 24, 'w': 26, 'x': 14, 'y': 7, 'z': 24
>>>

当我需要带有随机值的字典进行测试时,我会创建类似上面的字典。

另一种创建字典的方法,其中包含带有字符数的文本的每个字符。

>>> char_count = lambda text, char: text.count(char)
>>> text = "Genesis 1 - 1 In the beginning God created the heavens and the earth. 2 Now the earth was formless and desolate, and there was darkness upon the surface of the watery deep, and God's active force was moving about over the surface of the waters."
>>> my_dict = dict( [ ( char, char_count(text, char) ) for char in text ]  )
>>> my_dict
'G': 3, 'e': 32, 'n': 13, 's': 15, 'i': 5, ' ': 45, '1': 2, '-': 1, 'I': 1, 't': 17, 'h': 12, 'b': 2, 'g': 3, 'o': 12, 'd': 10, 'c': 5, 'r': 12, 'a': 19, 'v': 4, '.': 2, '2': 1, 'N': 1, 'w': 6, 'f': 6, 'm': 2, 'l': 2, ',': 2, 'k': 1, 'u': 4, 'p': 2, 'y': 1, "'": 1

说明: 1. lambda函数统计一个字符出现的次数。 2. 为文本中的每个字符调用 lambda 函数以获取该特定字符的计数。

注意:您可以改进此代码以避免重复调用重复字符。

使用字典理解可能比上述所有方法都容易:

 char:(text.count(char)) for char in text 

【讨论】:

【参考方案6】:

为了避免@Robert Ranjan 提到的重复,我们这样做

>>> import string
>>> char_count = lambda text, char: text.count(char)
>>> allAscii = list(string.printable)
>>> # alphabet = 'abcdefghijklmnopqrstuvwxyz'
>>> text = "Genesis 1 - 1 In the beginning God created the heavens and the earth. 2 Now the earth was formless and desolate, and * @ there was darkness upon the surface of the watery deep, and God's active force was moving about over the surface of the waters."
>>> # my_dict = dict( [ ( char, char_count(text, char) ) for char in alphabet]  
>>> my_dict = dict( [ ( char, char_count(text, char) ) for char in allAscii]
>>> for eachKey in my_dict:  
        print(repr(eachKey), ': ', my_dict[eachKey], ' ', end=' || ')    
'0' :  0   || '1' :  2   || '2' :  1   || '3' :  0   || '4' :  0   || '5' :  0   || '6' :  0   || '7' :  0   || '8' :  0   || '9' :  0   || 'a' :  19   || 'b' :  2   || 'c' :  5   || 'd' :  10   || 'e' :  32   || 'f' :  6   || 'g' :  3   || 'h' :  12   || 'i' :  5   || 'j' :  0   || 'k' :  1   || 'l' :  2   || 'm' :  2   || 'n' :  13   || 'o' :  12   || 'p' :  2   || 'q' :  0   || 'r' :  12   || 's' :  15   || 't' :  17   || 'u' :  4   || 'v' :  4   || 'w' :  6   || 'x' :  0   || 'y' :  1   || 'z' :  0   || 'A' :  0   || 'B' :  0   || 'C' :  0   || 'D' :  0   || 'E' :  0   || 'F' :  0   || 'G' :  3   || 'H' :  0   || 'I' :  1   || 'J' :  0   || 'K' :  0   || 'L' :  0   || 'M' :  0   || 'N' :  1   || 'O' :  0   || 'P' :  0   || 'Q' :  0   || 'R' :  0   || 'S' :  0   || 'T' :  0   || 'U' :  0   || 'V' :  0   || 'W' :  0   || 'X' :  0   || 'Y' :  0   || 'Z' :  0   || '!' :  0   || '"' :  0   || '#' :  0   || '$' :  0   || '%' :  0   || '&' :  0   || "'" :  1   || '(' :  0   || ')' :  0   || '*' :  1   || '+' :  0   || ',' :  2   || '-' :  1   || '.' :  2   || '/' :  0   || ':' :  0   || ';' :  0   || '<' :  0   || '=' :  0   || '>' :  0   || '?' :  0   || '@' :  1   || '[' :  0   || '\\' :  0   || ']' :  0   || '^' :  0   || '_' :  0   || '`' :  0   || '' :  0   || '|' :  0   || '' :  0   || '~' :  0   || ' ' :  47   || '\t' :  0   || '\n' :  0   || '\r' :  0   || '\x0b' :  0   || '\x0c' :  0   ||
>>> 

【讨论】:

以上是关于将字符串中的每个字符转换为字典键的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列表和字典将字符串转换为二进制代码

如何将逗号分隔的字符串转换为字符串,其中键是一个项目,值是键的长度

如何将字符串字典转换为字典并拆分为单独的列

将带有嵌入括号的字符串转换为字典

如何将字典中的字符串值转换为 int/float 数据类型?

如何将 JSON 字典列表转换为 Snowflake 中的字符串列表?