python列表推导生成字典的注意事项

版权声明:转载注明出处 https://blog.csdn.net/york1996/article/details/83107932

由于python的强大,使用其他语言语言需要写十多行甚至几十行的代码,在python中只需要一行就可以完成。

比如下面三种生成字典的方式:(区别在于右花括号的位置和键的生成方式)

print([{"i":i} for i in range(10)])
print()
print([{"i":i for i in range(10)}])
print()
print([{str(i):i for i in range(10)}])

将会输出:

[{'i': 0}, {'i': 1}, {'i': 2}, {'i': 3}, {'i': 4}, {'i': 5}, {'i': 6}, {'i': 7}, {'i': 8}, {'i': 9}]

[{'i': 9}]

[{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}]

解释:

第一个情况,当{}位于右边的时候,相当于生成了n个字典,每个字典的的长度是1.

第二个情况,当{}位于左边的时候,相当于生成了一个字典,字典的长度应该是n(第三个情况),但是由于键重复了,所以只保留最后一个生成的键值对。

第三个情况,就是生成的一个字典,字典的长度是n,元素是n个键值对。

在构造某些参数的时候,如果不注意就会出现错误。比如pytorch的optimizer的构造。

optimizer=torch.optim.SGD([{"params":mlp.parameters() for mlp in mlps}],lr=LR)

就得不到原本想要的结果,应该改成上述的第一个情况,也就是把花括号提前。保证生成9个键值对。

猜你喜欢

转载自blog.csdn.net/york1996/article/details/83107932
今日推荐