Python:列表字典理解

时间:2012-12-09 20:11:11

标签: python dictionary iteration

我有以下代码:

letters = 'defghijklmno'
K = {letters[i]:(i*i-1) for i in range(len(letters))}

我知道我正在迭代字母的序列变量以及如何计算值,但我对如何将键设置为字符串的各个字符感到困惑。特别是因为我把信件编入索引作为我的钥匙。基本上,我只想弄清楚python如何评估这个表达式

8 个答案:

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

对于从ii == 0的每个i == 11letters中的最后一个字母的索引),会在结果字典中添加一个条目,其中密钥为{{ 1}}及其关联值为letters[i]。这给出了:

i*i-1

等等。

答案 7 :(得分:0)

你实际上并没有迭代letters的字母本身;相反,您正在迭代letters长度,将i0变为1,再变为2 ,...,11。当您改变i时,您将创建一个字典条目,其密钥为i letters字母,其值为i*i - 1

换句话说,您创建一个字典,其中每个条目都包含来自k的字母(键)letters,与等于k的索引平方的值配对,减去1

您可以用简单的英语阅读字典理解:来自k索引letters的所有字母(键)i的字典,与值i*i - 1配对

相关问题