看到这两段程序,最初不能理解为什么二者是等价的
>>> k = "k:1|k1:2|k2:3|k3:4"
>>> dict1 = {}
>>> for items in k.split("|"):
... key, value = items.split(":")
... dict1[key] = value
>>> {k:v for items in k.split("|") for k, v in (items.split(":"), )}
{'k': '1', 'k1': '2', 'k2': '3', 'k3': '4'}
主要疑问在于后者的字典推导式为什么写成 for k, v in (items.split(":"), )
试着修改成for k, v in items.split(":"),果不其然报错了,如下
原因是in后面需要接一个可迭代对象,而items.split(":")得到的却只是一个列表[key,value],开始迭代后,会先尝试将第一个值key(不是期待的key与value)解包赋给k与v,这并不符合我的本意。
这样就可以理解为什么要在items.split(":")外再嵌套一层了,因为这样,in遍历的就是外层的循环,得到的第一个元素就是列表[key,value],并分别赋给k与v。
那现在还有一个疑问,为什么for k, v in (items.split(":"), )要加一个逗号,理由是:元组创建时如果只有一个元素,那要加一个逗号,不然会将()理解为运算符,就像下面这样
如上仅为个人理解,欢迎各位讨论与提出意见。题目(第99题)链接:http://t.csdnimg.cn/AKh7j