繁体   English   中英

Python:列表字典理解

[英]Python: List Dictionary Comprehension

我有以下代码:

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

我知道我要遍历字母的序列变量以及如何计算值,但是对于如何将键设置为字符串的各个字符感到困惑。 特别是因为我的字母被索引为我的钥匙。 基本上,我只是想弄清楚python如何评估这个表达式

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

说明:

>>> 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, ... (等)的字典。

好吧,首先,这是一个非常糟糕的方法。 在Python中,按索引循环是一种非常糟糕的做法(它比较慢,而且读取起来很恐怖),所以更好的方法是:

letters = 'defghijklmno'
K = {letter: (i*i-1) for i, letter in enumerate(letters)}

这仅仅是一个简单的字典理解 当我们遍历字符串时,我们得到了组成它们的各个字符。 我们使用内置的enumerate()给我们匹配的数字,然后生成一个从字母到数字的平方的字典,减一。

如果您在自己的理解上挣扎,那相当于for循环(更快),我建议您观看我的视频以获取完整的解释,其中包括表亲(表/集合理解和生成器表达式)以及字典理解的示例。

第二行是字典理解。 就像正常的列表理解或生成器表达式一样,不同之处在于它生成键值对,然后将其用于形成字典。

该代码大致相当于

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

您可以将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程序员看来)。

要理解它,有助于查看发生的各个部分。 for i in range(len(letters))循环中的for i in range(len(letters))不会在字母的各个字符上循环,而是在字符串的indizes上循环。 这是因为您可以使用其索引访问字符串的单个字符。 因此, letters[0]指向第一个字符, letters[1]指向第二个字符, letters[len(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]

因此,现在我们既有键又有值。 词典理解现在要做的就是将这些键链接到值(按上述顺序)。

对于每一个ii == 0i == 11 (在最后一个字母的索引letters ),一个条目被添加到所得的字典其中键是letters[i]和它的相关联的值是i*i-1 这给出:

K['d'] == -1
K['e'] == 0
K['f'] == 3

等等。

本质上,您实际上并没有遍历字母的letters 相反,您要遍历letters长度 ,方法是将i0更改为1 ,再将2更改为...,再更改为11 随着i变化,您将创建一个字典条目,其关键字是字母的第iletters ,其值是i*i - 1

换言之,创建字典,每个条目均由一个字母(键)的kletters ,具有等于的值成对k的指数的平方减去1

您可以将通俗易懂的字典理解为:索引为i letters与值i*i - 1配对的所有字母(键) k的字典。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM