[str(wi) for wi in wordids]
是一个列表推导式。
a = [str(wi) for wi in wordids]
是相同的意思
a = []
for wi in wordids:
a.append(str(wi))
所以
createkey='_'.join(sorted([str(wi) for wi in wordids]))
从
wordids
中的每个项目创建一个字符串列表,然后对该列表进行排序,并使用
_
作为分隔符将其连接成一个大字符串。
正如agf所指出的那样,您还可以使用生成器表达式,它看起来就像列表推导式,但是用圆括号代替方括号。如果您以后不需要它(除了迭代它),则可以避免构建列表。如果您已经有了括号,例如在此处与
sorted(...)
一起使用,则可以直接删除方括号。
然而,在这种特殊情况下,您不会获得性能优势(实际上,它会慢大约10%;我计时了),因为
sorted()
无论如何都需要构建一个列表,但它看起来更好一些:
createkey='_'.join(sorted(str(wi) for wi in wordids))
normalizedscores = dict([(u,float(l)/maxscore) for (u,l) in linkscores.items()])
这段代码迭代遍历字典 linkscores
的每一个键值对,创建一个键/l/maxscore
元组列表, 然后将该列表转换回字典。
然而,自从Python 2.7版本起,你也可以使用字典推导式:
normalizedscores = {u:float(l)/maxscore for (u,l) in linkscores.items()}
这里是一些时间数据:
Python 3.2.2
>>> import timeit
>>> timeit.timeit(stmt="a = '_'.join(sorted([str(x) for x in n]))", setup="import random; n = [random.randint(0,1000) for i in range(100)]")
61.37724242267409
>>> timeit.timeit(stmt="a = '_'.join(sorted(str(x) for x in n))", setup="import random; n = [random.randint(0,1000) for i in range(100)]")
66.01814811313774
Python 2.7.2
>>> import timeit
>>> timeit.timeit(stmt="a = '_'.join(sorted([str(x) for x in n]))", setup="import random; n = [random.randint(0,1000) for i in range(100)]")
58.01728623923137
>>> timeit.timeit(stmt="a = '_'.join(sorted(str(x) for x in n))", setup="import random; n = [random.randint(0,1000) for i in range(100)]")
60.58927580777687
sorted()
无论如何都会构建一个列表吗? - Tim Pietzckerlist()
操作,但在早期版本中可能会有10%的差异,这一点也不奇怪。 - agfsorted()
(然后返回一个新列表)。对于genex,sorted()
首先必须从genex结果构建一个列表,然后构造一个它返回的列表。我在Python 3.2.2上计时过,效果比Python 2.7.2更明显(我已在我的新编辑答案中包含了计时)。 - Tim Pietzcker