歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋(píng)果6袋
6
麥子學(xué)院

Python數(shù)組創(chuàng)建中的坑詳解

發(fā)布時(shí)間:2017-08-16 17:22  回復(fù):0  查看:2380   最后回復(fù):2017-08-16 17:22  
本文和大家分享的主要是python 中創(chuàng)建數(shù)組過(guò)程中的一些坑,一起來(lái)看看吧,希望對(duì)大家 學(xué)習(xí)python 有所幫助。
   1、問(wèn)題的引出
  在做leetcode 的題目時(shí),遇到了一個(gè)求數(shù)組中出現(xiàn)次數(shù)最多的 k 個(gè)元素的題,參照答案的思路,首先利用一個(gè) dict 記錄所有元素出現(xiàn)的次數(shù), key:value 中的 key 表示元素, value 表示元素出現(xiàn)的次數(shù),隨后根據(jù)元素出現(xiàn)的次數(shù)將元素放入對(duì)應(yīng)的桶中,桶是一個(gè)二維數(shù)組,桶中第一個(gè)元素保存出現(xiàn)次數(shù)為 0 的元素,桶中第二個(gè)元素保存出現(xiàn)次數(shù)為 1 的元素,依次類推。最后從后往前遍歷桶,取出出現(xiàn)次數(shù)最多的 k 個(gè)元素即可。
  按照這樣的思路,我寫(xiě)了如下的代碼:
   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))
  看似完美無(wú)缺啊,不過(guò)結(jié)果不對(duì)啊,結(jié)果輸出了12,不應(yīng)該是-12么,于是我打印了bucket1,發(fā)現(xiàn)是這樣的:
  [[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]]
  為什么所有的元素都一樣呢?
  于是 我換了一種方法創(chuàng)建bucket
  bucket = [[] for _ in range(len(nums)+1)]
  結(jié)果正常,此時(shí)bucket的輸出為:
  [[], [1, 3, 4], [2, -1], [], [], [], [], []]
  那么,看似一樣的創(chuàng)建bucket的方法,為什么輸出會(huì)不一樣呢?
  2、問(wèn)題的解釋
  問(wèn)題就在與,第一種即使用*創(chuàng)建數(shù)組時(shí),數(shù)組中的每一個(gè)元素都是同一個(gè)list object,那么往任意一個(gè)中添加元素,實(shí)際上是往所有的元素中添加,所以會(huì)出現(xiàn)之前的結(jié)果,而用列表生成式的方法,不會(huì)有問(wèn)題,因?yàn)槊恳粋€(gè)list都是不同的list object,我們來(lái)看一看下面的代碼:
  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中的每一個(gè)元素的id都是相同的,說(shuō)明是同一個(gè)元素,而bucket中的每一個(gè)元素的id是不同的,說(shuō)明是不同的元素。
來(lái)源:簡(jiǎn)書(shū)

您還未登錄,請(qǐng)先登錄

熱門(mén)帖子

最新帖子

?