Python数组创建中的这些坑,你造吗?

本文和大家分享的主要是python 中创建数组过程中的一些坑,一起来看看吧,希望对大家 学习python 有所帮助。

1、问题的引出

在做leetcode 的题目时,遇到了一个求数组中出现次数最多的 k 个元素的题,参照答案的思路,首先利用一个 dict 记录所有元素出现的次数, key:value 中的 key 表示元素, value 表示元素出现的次数,随后根据元素出现的次数将元素放入对应的桶中,桶是一个二维数组,桶中第一个元素保存出现次数为 0 的元素,桶中第二个元素保存出现次数为 1 的元素,依次类推。最后从后往前遍历桶,取出出现次数最多的 k 个元素即可。

按照这样的思路,我写了如下的代码:

class  Solution(object):

def  topKFrequent(self, nums, k):

"""

:type nums: List[int]

:type k: int

:rtype: List[int]

"""

bucket1 = [[]] * (len(nums) + 1)

freq_map = dict()

for num  in nums:

freq_map[num] = freq_map.get(num,0) + 1

print (freq_map)

for key  in freq_map:

#bucket[freq_map[key]].append(key)

bucket1[freq_map[key]].append(key)

res = []

for i  in range(len(bucket1)-1,-1,-1):

res += bucket1 

if len(res) >= k:

return res[:k]

s = Solution()print (s.topKFrequent([4,1,-1,2,-1,2,3],2))

看似完美无缺啊,不过结果不对啊,结果输出了1和2,不应该是-1和2么,于是我打印了bucket1,发现是这样的:

[[1, 2, 3, 4, -1], [1, 2, 3, 4, -1], [1, 2, 3, 4, -1], [1, 2, 3, 4, -1], [1, 2, 3, 4, -1], [1, 2, 3, 4, -1], [1, 2, 3, 4, -1], [1, 2, 3, 4, -1]]

为什么所有的元素都一样呢?

于是 我换了一种方法创建bucket:

bucket = [[] for _ in range(len(nums)+1)]

结果正常,此时bucket的输出为:

[[], [1, 3, 4], [2, -1], [], [], [], [], []]

那么,看似一样的创建bucket的方法,为什么输出会不一样呢?

2、问题的解释

问题就在与,第一种即使用*创建数组时,数组中的每一个元素都是同一个list object,那么往任意一个中添加元素,实际上是往所有的元素中添加,所以会出现之前的结果,而用列表生成式的方法,不会有问题,因为每一个list都是不同的list object,我们来看一看下面的代码:

bucket = [[] for _ in range(len(nums)+1)]

bucket1 = [[]] * (len(nums) + 1)

print (bucket)print (bucket1)

print (id(bucket1[0]),id(bucket1[1]))

print(id(bucket[0]), id(bucket[1]))

输出为:

[[], [], [], [], [], [], [], []]

[[], [], [], [], [], [], [], []]

4342035336 4342035336

4342034568 4342034952

可以看到,bucket1中的每一个元素的id都是相同的,说明是同一个元素,而bucket中的每一个元素的id是不同的,说明是不同的元素。

来源:简书

时间: 2024-10-12 21:21:51

Python数组创建中的这些坑,你造吗?的相关文章

Python开发过程中17个坑

一.不要使用可变对象作为函数默认值 复制代码代码如下: In [1]: def append_to_list(value, def_list=[]):   ...:         def_list.append(value)   ...:         return def_list   ...: In [2]: my_list = append_to_list(1) In [3]: my_listOut[3]: [1] In [4]: my_other_list = append_to_l

JavaScript中的数组创建

JavaScript中的数组创建 数组是一个包含了对象或原始类型的有序集合.很难想象一个不使用数组的程序会是什么样. 以下是几种操作数组的方式: 初始化数组并设置初始值 通过索引访问数组元素 添加新元素 删除现有元素 本文涵盖了数组的初始化以及设置初始值的操作.在JavaScript中要做到这一点的基本方法是使用数组字面量,例如[1, 5, 8]或是数组构造器new Array (1, 5, 8). 除了手动枚举之外,JavaScript还提供了更有趣更直接的数组创建方式.让我一起看看在Java

python如何二删除二维或者三维数组/列表中某维的空元素

如题,个人在使用python进行数据预处理过程中出现的问题,抽象成删除三维列表中某维为空的问题. 一.首先来看一下三维数组/列表的结构 仔细看下图就会很清楚了: 轴0即是去除第一个外括号后第一层(我把它称做第一维)有四大块: 对轴1则是对每一块来说,去掉大块的括号后的四小横条(我把它称作第二维): 对轴2则是对每一条来说,去掉小条的括号后的每一个数(从外往里数第三层括号,我就叫做第三维) 二.代码 1.删除二维数组中为空的元素则比较简单: oldlist=[[1, 1, 1, 1, 1], [1

Netty中的那些坑

Netty中的那些坑(上篇) 最近开发了一个纯异步的redis客户端,算是比较深入的使用了一把netty.在使用过程中一边优化,一边解决各种坑.儿这些坑大部分基本上是Netty4对Netty3的改进部分引起的. 注:这里说的坑不是说netty不好,只是如果这些地方不注意,或者不去看netty的代码,就有可能掉进去了. 坑1: Netty 4的线程模型转变 在Netty 3的时候,upstream是在IO线程里执行的,而downstream是在业务线程里执行的.比如netty从网络读取一个包传递给

Python数组使用

python数组的使用 2010-07-28 17:17 1.Python的数组分三种类型: (1) list 普通的链表,初始化后可以通过特定方法动态增加元素. 定义方式:arr = [元素] (2) Tuple 固定的数组,一旦定义后,其元素个数是不能再改变的. 定义方式:arr = (元素) (2) Dictionary 词典类型, 即是Hash数组. 定义方式:arr = {元素k:v} 2.下面具体说明这些数组的使用方法和技巧: (1) list 链表数组 a.定义时初始化 a = [

python数组列表、字典、拷贝、字符串

python中字符串方法 1 name = "I teased at life as if it were a foolish game" 2 print(name.capitalize())#首字母大写 3 print(name.count("a"))#查找字符串中a的个数 4 print(name.center(50,"-"))#长度为50将name放中间不够的用-补全 5 print(name.endswith("ex"

Python源码中的PyCodeObject

1.Python程序的执行过程 Python解释器(interpreter)在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生的一组Python的字节码(byte code),然后将编译的结果交给Python虚拟机(Virtual Machine),由虚拟机按照顺序一条一条地执行字节码,从而完成对Python程序的执行动作. 对比java的执行: java:     .java-->(javac)-->.class-->(

numpy数组和python数组的区别

1.numpy数组创建时是固定大小,python数组(list)是动态的.更改ndarray的大小将创建一个新数组并删除原来的数组. 2.元素类型区别. NumPy数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同. python的List可以存放不同类型的元素. 例外情况:Python的原生数组里包含了NumPy的对象的时候,这种情况下就允许不同大小元素的数组. 3.数学操作执行效率高于原生python 4.越来越多的基于Python的科学和数学软件包使用NumPy数组 原文地址:h

python 在机器学习中应用函数

浅述python中argsort()函数的用法 (1).先定义一个array数据 1 import numpy as np 2 x=np.array([1,4,3,-1,6,9]) (2).现在我们可以看看argsort()函数的具体功能是什么: x.argsort() 输出定义为y=array([3,0,2,1,4,5]). 我们发现argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y.例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以