標籤:
本文和大家分享的主要是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是不同的,說明是不同的元素。
來源:簡書
Python數組建立中的這些坑,你造嗎?