我刚刚开始阅读关于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都没有定义。。你知道吗
谢谢,马特
你的问题是使用列表理解初始化字典。要分解它:
dict可以这样初始化
本书中的列表理解由以下部分组成:
1。你知道吗
2。你知道吗
三。你知道吗
因此:
等效代码为:
输出的字典碰巧从3开始,因为字典没有排序。你知道吗
我希望现在更清楚了。你知道吗
你必须深入list comprehensions以获得一些必要的背景知识。你知道吗
尽管如此,您还是可以从成对的列表中创建字典,其中第一个值将被指定为键,第二个值将被指定为值。下面的代码有相同的想法,但它将帮助您了解它是如何工作的。你知道吗
您的代码得到的是相反的结果,因为您没有将
enumerate
返回的值反转(正如您在我的示例和原始代码中看到的那样)。你知道吗这是一个列表理解+元组解包,转换成dict
列表理解采用
[f(i) for i in iterable]
的形式。在本例中,iterable
是enumerate(sockets)
,它创建了一个由两个元素组成的元组。你知道吗元组可以解包。ie
i,j = (0,1)
将0
分配给i
,将1
分配给j
。你知道吗所以,基本上,
i
和s
是在插入符号指向的地方创建的。你知道吗(顺便说一下,在Python2.7+中,您还可以使用字典理解。
sock2task = { s: i + 1 for i,s in enumerate(sockets)}
相关问题 更多 >
编程相关推荐