Python列表乘法小记
来源:互联网 发布:网络语笔芯是啥意思 编辑:程序博客网 时间:2024/05/16 00:49
说明一下Python中列表乘法生成列表与直接写出列表的不同。
首先说一下需要列表乘法生成列表的情况:
比如,我们初始化一个0列表,我们可以[0]*10,生成一个长度为10的全0列表,这样做没问题
再比如,我们嵌套列表初始化一个矩阵,类似[[],[],[]],我们可以用[[]]*3,但是这里就有问题了。[0]*10与[[]]*3不同之处在于0是不可变对象,[]是可变对象,列表乘法所生成的大列表中小列表之间的关系是引用用代码来说明一下:
test_list = [[]]*3
print id(test_list[0])
print id(test_list[1])
print id(test_list)
结果:
394401363944013640163400
这意味着,test_list里面每个元素都是id39440136这个列表元素的索引,这样我们就没法实现多个列表分开存储的需求如果是列表加法和直接写列表的话,列表中每个元素都是独立的对象。
对于列表加法乘法的理解不能像数学上一样,a*b=b个a相加
下面是实际中遇到的这个例子:我想用四个字典分别统计ip四个字段数值出现频数,结果没有意识到列表乘法的这个问题,导致错误
错误例子:
test = ['111.111.111.111', '222.222.222.222']nums = [{}]*4for line in test: ip_nums = map(int, line.split('.')) for i in range(2): nums[i][ip_nums[i]] = nums[i].get(ip_nums[i], 0)+1print nums
输出:
[{222: 4, 111: 4}, {222: 4, 111: 4}, {222: 4, 111: 4}, {222: 4, 111: 4}]
修改后:
test = ['111.111.111.111', '222.222.222.222']nums = [{}, {}, {}, {}]for line in test: ip_nums = map(int, line.split('.')) for i in range(2): nums[i][ip_nums[i]] = nums[i].get(ip_nums[i], 0)+1print nums输出:
[{222: 1, 111: 1}, {222: 1, 111: 1}, {222: 1, 111: 1}, {222: 1, 111: 1}]
0 0
- Python列表乘法小记
- python基础知识之列表的加法、乘法
- Python 3语法小记(二)列表 和 元组
- python 小记
- python小记
- python小记
- python 小记
- python 小记
- Python 小记
- Python小记
- Python(5)使用for...in循环和列表推导式打印一个99乘法表
- 兄弟连学Python(01)——列表推导式写99乘法表
- angularJS学习小记(1)----99乘法表
- 乘法散列表的分析
- Python打印乘法口诀
- python实现高精度乘法
- Python 线性代数 矩阵乘法
- python学习-乘法口诀
- LeetCode-206. Reverse Linked List
- C++中的内联函数inline总结
- 回退版本
- Leetcode 126. Word Ladder II[hard]
- oracle使用DBMS_SCHEDULER调度作业
- Python列表乘法小记
- dedecms添加自定义图片字段,出现的问题
- hdu1503_Advanced Fruits LCS变形
- Fast and Accurate Image Upscaling with Super-Resolution Forests
- 怎么解决Ubuntu14.04不能打正确拼音
- UVa489
- 交叉编译器的制作
- Java中内存泄露问题
- svn 上传.a文件失败问题