了解使用for i循环创建特定python字典

2024-04-25 21:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始阅读关于Twisted(http://krondo.com/blog/?p=1247)的Dave Peticolas教程,并快速浏览了他使用Python套接字的早期示例,我发现了一行我无法理解的代码。代码在他的github上,特别是https://github.com/jdavisp3/twisted-intro/blob/master/async-client/get-poetry.py,但是上下文并不重要。你知道吗

这是台词:

sock2task = dict([(s, i + 1) for i, s in enumerate(sockets)])

其中sockets是套接字列表。你知道吗

此行将以

{<sock3 object>: 3, <sock3 object>: 2, <sock3 object>: 1}

然而,我只是不明白怎么做。你知道吗

为了得到一个等价的陈述,我想出了

sock2task = dict(enumerate(sockets, start=1))

但是这会导致

{1: <sock3 object>, 2: <sock3 object>, 3: <sock3 object>}

它的键和值交换了,并且是相反的。你知道吗

那么它是如何工作的呢?在完整的代码中,s和i都没有定义。。你知道吗

谢谢,马特


Tags: 代码githubcomhttpobjecttwistedblogdict
3条回答

你的问题是使用列表理解初始化字典。要分解它:

dict可以这样初始化

dict = dict([(key0, value0), ...)])  # make a dictionary out of a list of tuples

本书中的列表理解由以下部分组成:

1。你知道吗

# "for every index i and corresponding entry s in sockets"
for i, s in enumerate(sockets)

2。你知道吗

# a tuple of the socket s and its index + 1: `i + 1`
(s, i + 1) 

三。你知道吗

# "Make a list in which for every index i 
# and corresponding entry s in sockets there is a tuple (s, i + 1)"
[(s, i + 1) for i, s in enumerate(sockets)] 

因此:

# "Convert this whole thing into a dictionary!" 
dict([(s, i + 1) for i, s in enumerate(sockets)])

等效代码为:

sock2task = {}
for index, socket in enumerate(sockets):
    sock2task[socket] = index + 1

输出的字典碰巧从3开始,因为字典没有排序。你知道吗

我希望现在更清楚了。你知道吗

你必须深入list comprehensions以获得一些必要的背景知识。你知道吗

尽管如此,您还是可以从成对的列表中创建字典,其中第一个值将被指定为键,第二个值将被指定为值。下面的代码有相同的想法,但它将帮助您了解它是如何工作的。你知道吗

result = {}
for index, s in enumerate(sockets):
    result[s] = index + 1

您的代码得到的是相反的结果,因为您没有将enumerate返回的值反转(正如您在我的示例和原始代码中看到的那样)。你知道吗

sock2task = dict([(s, i + 1) for i, s in enumerate(sockets)])
                                  ^

这是一个列表理解+元组解包,转换成dict

列表理解采用[f(i) for i in iterable]的形式。在本例中,iterableenumerate(sockets),它创建了一个由两个元素组成的元组。你知道吗

元组可以解包。ie i,j = (0,1)0分配给i,将1分配给j。你知道吗

所以,基本上,is是在插入符号指向的地方创建的。你知道吗

(顺便说一下,在Python2.7+中,您还可以使用字典理解。sock2task = { s: i + 1 for i,s in enumerate(sockets)}

相关问题 更多 >