我有以下代码:
letters = 'defghijklmno'
K = {letters[i]:(i*i-1) for i in range(len(letters))}
我知道我正在迭代字母的序列变量以及如何计算值,但我对如何将键设置为字符串的各个字符感到困惑。特别是因为我把信件编入索引作为我的钥匙。基本上,我只想弄清楚python如何评估这个表达式
答案 0 :(得分:3)
dict
理解基本上是以下的同义词:
k = {}
for i in range(len(letters)):
k[letters[i]] = i*i - 1
不同之处在于它创建了一个新的范围,而不是使用外部范围:
>>> letters = 'defghijklmno'
>>> K = {letters[i]:(i*i-1) for i in range(len(letters))}
>>> i # was defined in an inner scope
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
>>> k = {}
>>> for i in range(len(letters)):
... k[letters[i]] = i*i - 1
...
>>> i # still defined!
11
答案 1 :(得分:3)
说明:
>>> letters = 'defghijklmno'
>>> range(len(letters))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
这意味着,
>>> [letters[i] for i in range(len(letters))]
['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
同时
>>> [(i*i-1) for i in range(len(letters))]
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80, 99, 120]
因此,你的字典理解构建了对'd':-1, 'e':0, 'f':3, ...
(等)的字典。
答案 2 :(得分:1)
嗯,首先,这是一种相当糟糕的做法。循环索引在Python中是一个非常糟糕的做法(它更慢,读起来很糟糕),所以更好的方法是:
letters = 'defghijklmno'
K = {letter: (i*i-1) for i, letter in enumerate(letters)}
这一切都很简单dictionary comprehension。当我们遍历一个字符串时,我们会得到个别字符。我们使用enumerate()
内置函数为我们提供匹配的数字,然后生成一个字母,从字母到数字的平方减去一。
如果你正在努力理解本身,它相当于一个for循环(除了更快),我建议你观看my video以获得完整的解释,并附上字典理解的例子以及它的表兄弟(list / set comprehensions)和生成器表达式)。
答案 3 :(得分:0)
第二行是字典理解。它就像一个普通的列表推导或生成器表达式,除了它生成键值对然后用于形成字典。
代码大致相当于
letters = 'defghijklmno'
K = {}
for i in range(len(letters)):
key = letters[i]
val = (i*i-1)
K[key] = val
答案 4 :(得分:0)
您可以将Dict理解重写为
循环K = {} # empty dict
for i in range(len(letters)): # i goes from 0 to 11
K[letters[i]] = i*i-1
所以在单次迭代中你有
K['d'] = -1
K['e'] = 0
K['f'] = 3
# ...
等等。 dict理解只是一个更短的(并且在大多数python程序员看来)更优雅的方式来编写这个循环。
答案 5 :(得分:0)
要理解它,有助于查看所发生事件的各个部分。 for i in range(len(letters))
循环不会循环遍历字母的各个字符,而是覆盖字符串的各个字符。这是因为您可以使用索引访问字符串的双字符。因此letters[0]
指的是第一个字符,letters[1]
指的是第二个字符,letters[len(letters)-1]
指的是最后一个字符。
所以,让我们分别看一下字典的键:
>>> [letters[i] for i in range(len(letters))]
['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
因此,您可以按原始顺序单独获取所有字母。
现在,让我们看一下字典的值:
>>> [(i*i-1) for i in range(len(letters))]
[-1, 0, 3, 8, 15, 24, 35, 48, 63, 80, 99, 120]
所以,现在我们有了键和值;字典理解现在所做的就是将这些键与值相关联 - 按上面的顺序。
答案 6 :(得分:0)
对于从i
到i == 0
的每个i == 11
(letters
中的最后一个字母的索引),会在结果字典中添加一个条目,其中密钥为{{ 1}}及其关联值为letters[i]
。这给出了:
i*i-1
等等。
答案 7 :(得分:0)
你实际上并没有迭代letters
的字母本身;相反,您正在迭代letters
的长度,将i
从0
变为1
,再变为2
,...,11
。当您改变i
时,您将创建一个字典条目,其密钥为i
letters
字母,其值为i*i - 1
。
换句话说,您创建一个字典,其中每个条目都包含来自k
的字母(键)letters
,与等于k
的索引平方的值配对,减去1
。
您可以用简单的英语阅读字典理解:来自k
索引letters
的所有字母(键)i
的字典,与值i*i - 1
配对