Python多維列表中的坑如何解決

這篇文章主要講解了“Python多維列表中的坑如何解決”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python多維列表中的坑如何解決”吧!

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開(kāi)發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。成都創(chuàng)新互聯(lián)公司專業(yè)提供做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、響應(yīng)式網(wǎng)站、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

數(shù)組常用想法總結(jié):

(以下默認(rèn)nums為數(shù)組。) 1.遍歷數(shù)組 遍歷:

for num in nums:
	xxxx

帶索引遍歷

for idx,num in enumerate(nums):
	xxxx

2.動(dòng)態(tài)規(guī)劃(dp) 動(dòng)態(tài)規(guī)劃一般可以用一個(gè)數(shù)組保存狀態(tài)。見(jiàn)53.最大子數(shù)組和。 用數(shù)組保存狀態(tài)是非常常用的做法。例如36.有效的數(shù)獨(dú)、 73. 矩陣置零

3.雙指針 見(jiàn)88.合并兩個(gè)有序數(shù)組、350.兩個(gè)數(shù)組的交集 II可以是左右指針對(duì)一個(gè)數(shù)組使用。 也可以是兩個(gè)指針遍歷兩個(gè)數(shù)組。while index1<m and index2<n:

列表常用函數(shù)

Python中一般用list實(shí)現(xiàn)可變數(shù)組。 下面是list常用的函數(shù)。 (可變序列類型通用操作,只有.sortlist獨(dú)有的。參考序列操作文檔)

函數(shù)功能
nums.sort(key,reversed)(原地)按照key升序排序,reversed可以指定是否反轉(zhuǎn)。
sorted(nums,key,reversed)用法與nums.sort類似,但返回另一個(gè)數(shù)組,原數(shù)組不變。
s.append(x)將 x 添加到序列的末尾
s.extend(t)s += t用 t 的內(nèi)容擴(kuò)展 s
x in s判斷x是否在數(shù)組nums中。
len(s)返回s 長(zhǎng)度
max(s)、min(s)返回s最大值、最小值
all(iterable)如果 iterable 的所有元素均為真值(或可迭代對(duì)象為空)則返回 True
any(iterable)如果 iterable 的任一元素為真值則返回 True。 如果可迭代對(duì)象為空,返回 False。

多維列表的一個(gè)坑

創(chuàng)建多維列表,一般用

w, h = 2, 3
A = [[None] * w for i in range(h)]

等價(jià)于

A = [None] * 3
for i in range(3):
    A[i] = [None] * 2

而不是

 A = [[None] * 2] * 3

原因在于用*對(duì)列表執(zhí)行重復(fù)操作并不會(huì)創(chuàng)建副本,而只是創(chuàng)建現(xiàn)有對(duì)象的引用*3創(chuàng)建的是包含 3 個(gè)引用的列表,每個(gè)引用指向的是同一個(gè)長(zhǎng)度為 2 的列表。 如果你給一項(xiàng)賦值,就會(huì)發(fā)現(xiàn)這個(gè)問(wèn)題:

>>> A[0][0] = 5
>>> A
[[5, None], [5, None], [5, None]]

第1天

217. 存在重復(fù)元素

給定數(shù)組,判斷是否存在重復(fù)元素。 做法:

  1. 直接遍歷(窮舉)

  2. 排序后,比較每個(gè)元素和下一個(gè)元素

  3. 哈希表

直接遍歷會(huì)超時(shí)。 2的時(shí)間復(fù)雜度是O(nlogn) 也就是排序的時(shí)間復(fù)雜度 3的時(shí)間復(fù)雜度是O(n),但需要額外的O(n)輔助空間。 (窮舉法基本都能想到,但很容易超時(shí),后面只有在窮舉法能通過(guò)時(shí)才列出來(lái)。)

3比較簡(jiǎn)單,這里寫一下3的做法:

return len(nums) != len(set(nums))

53. 最大子數(shù)組和

給定數(shù)組,求其中一個(gè)連續(xù)數(shù)組和的最大值。

比較容易想到的是用一個(gè)數(shù)組記錄目前位置最大的值(動(dòng)態(tài)規(guī)劃)。

dp[i] 表示以i位置結(jié)尾的連續(xù)數(shù)組和的最大值。 最后返回dp數(shù)組中最大值。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        length = len(nums)
        dp = [0 for i in range(length)]
        for i in range(length):
            dp[i] = max(dp[i - 1], 0) + nums[i]
        return max(dp)

題解給出了一種省略dp數(shù)組的方法:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        pre = 0
        res = nums[0]
        for x in nums:
            pre = max(pre+x ,x)
            res = max(res, pre)
        return res

第2天

1. 兩數(shù)之和

找出數(shù)組中兩個(gè)數(shù)之和等于target的兩數(shù)下標(biāo)。

暴力枚舉可以

但時(shí)間較長(zhǎng),時(shí)間復(fù)雜度$O(N^2)$

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for i in range(n):
            for j in range(i + 1, n):
                if nums[i] + nums[j] == target:
                    return [i, j]
        
        return []
哈希表

官方題解的一個(gè)比較巧妙的方式:使用哈希表(字典) 用字典記錄出現(xiàn)過(guò)的數(shù)字的位置。 時(shí)間復(fù)雜度$O(N)$,空間復(fù)雜度$O(N)$

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict()
        for i, num in enumerate(nums):
            if target - num in hashtable:
                return [hashtable[target - num], i]
            hashtable[nums[i]] = i
        return []

88. 合并兩個(gè)有序數(shù)組

兩個(gè)有序數(shù)組,將第二個(gè)數(shù)組nums2合并到第一個(gè)數(shù)組nums1。

雙指針

1.可以用雙指針遍歷兩個(gè)數(shù)組:

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        # 兩個(gè)中存在空數(shù)組的時(shí),直接返回
        if m == 0:
            nums1[:] = nums2[:]
            return
        if n == 0:
            return

        index1,index2 = 0,0
        t = []
        while index1<m and index2<n:
            if nums1[index1] <= nums2[index2]:
                t.append(nums1[index1])
                index1 += 1
            else:
                t.append(nums2[index2])
                index2 += 1 
        
        if index1 < m:
            t += nums1[index1:m]
        else:
            t += nums2[index2:n]

        nums1[:] = t[:]

官方版本,更簡(jiǎn)潔、清楚。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        sorted = []
        p1, p2 = 0, 0
        while p1 < m or p2 < n:
            if p1 == m:
                sorted.append(nums2[p2])
                p2 += 1
            elif p2 == n:
                sorted.append(nums1[p1])
                p1 += 1
            elif nums1[p1] < nums2[p2]:
                sorted.append(nums1[p1])
                p1 += 1
            else:
                sorted.append(nums2[p2])
                p2 += 1
        nums1[:] = sorted
(暴力) 追加后排序
  1. 更簡(jiǎn)單粗暴的方式是直接將nums2追加到nums1后,進(jìn)行排序。 及其簡(jiǎn)單而且效果很好。

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[m:] = nums2
        nums1.sort()

第3天

350. 兩個(gè)數(shù)組的交集 II

以數(shù)組形式返回兩數(shù)組的交集(數(shù)組形式,返回結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中都出現(xiàn)的次數(shù)一致)。 排序后雙指針遍歷。

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()
        i = 0
        j = 0
        result = []
        while i<len(nums1) and j<len(nums2):
            if(nums1[i]<nums2[j]):
                i+=1
            elif(nums1[i]>nums2[j]):
                j+=1
            else:
                result.append(nums1[i])
                i+=1
                j+=1
       
        return  result

121. 買賣股票的最佳時(shí)機(jī)

只需要記錄下當(dāng)前最低價(jià),遍歷價(jià)格過(guò)程中,用當(dāng)前價(jià)格-最低價(jià) 就是當(dāng)前可獲得的最大利潤(rùn)。另外如果出現(xiàn)了更低的價(jià)格,則最低價(jià)也要更新。(一個(gè)樸素的想法,要是我在最低點(diǎn)買進(jìn)就好了) 總的最大利潤(rùn)就是這些利潤(rùn)中的最大值。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        r = 0
        min_price = float('inf')  # float('inf')表示正無(wú)窮
        for price in prices:
            min_price = min(min_price, price)  # 截止到當(dāng)前的最低價(jià)(買入價(jià))
            r = max(r, price - min_price)  # 截止到目前的最高利潤(rùn)
        return r

第4天

566. 重塑矩陣

給定一個(gè)mxn的數(shù)組,重構(gòu)為rxc的數(shù)組。 比較簡(jiǎn)單的想法是把數(shù)組拉平為一位數(shù)組,然后逐個(gè)填充到新的數(shù)組中:

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
        m,n = len(mat), len(mat[0])
        if m*n != r*c:
            return mat
        arr = []
        for row in mat:
            for x in row:
                arr.append(x)
        arr_index = 0
        newmat = [[0 for j in range(c)]for i in range(r)]
        for i in range(r):
            for j in range(c):
                newmat[i][j] = arr[arr_index]
                arr_index += 1
        return newmat

官方提供了一種直接計(jì)算下標(biāo)的方法:

class Solution:
    def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:
        m, n = len(nums), len(nums[0])
        if m * n != r * c:
            return nums
        
        ans = [[0] * c for _ in range(r)]
        for x in range(m * n):
            ans[x // c][x % c] = nums[x // n][x % n]
        
        return ans

118. 楊輝三角

找規(guī)律題??梢灾苯影凑丈傻囊?guī)律生成數(shù)組。在「楊輝三角」中,每個(gè)數(shù)是它左上方和右上方的數(shù)的和。

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        res = [[]for _ in range(numRows)]
        res[0] = [1]
        for i in range(1,numRows):
            res[i].append(1)
            for j in range(0,len(res[i-1])-1):
                res[i].append(res[i-1][j] + res[i-1][j+1])
            res[i].append(1)

        return res

第5天

36. 有效的數(shù)獨(dú)

判斷當(dāng)前數(shù)獨(dú)是否有效(不需要填充數(shù)獨(dú)) 只要用3個(gè)二維數(shù)組維護(hù)9行、9列、9個(gè)九宮格。

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        row = [[] * 9 for _ in range(9)]
        col = [[] * 9 for _ in range(9)]
        nine = [[] * 9 for _ in range(9)]
        for i in range(len(board)):
            for j in range(len(board[0])):
                tmp = board[i][j]
                if not tmp.isdigit():
                    continue
                if (tmp in row[i]) or (tmp in col[j]) or (tmp in nine[(j // 3) * 3 + (i // 3)]):
                    return False
                row[i].append(tmp)
                col[j].append(tmp)
                nine[(j // 3) * 3 + (i // 3)].append(tmp)
        return True

73. 矩陣置零

如果一個(gè)元素為 0 ,則將其所在行和列的所有元素都設(shè)為 0 。請(qǐng)使用 原地 算法。 A: 利用數(shù)組的首行和首列來(lái)記錄 0 值 另外用兩個(gè)布爾值記錄首行首列是否需要置0

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        #標(biāo)記
        m,n = len(matrix), len(matrix[0])
        row = any(x == 0 for x in matrix[0])
        col = any(matrix[r][0] == 0 for r in range(m) )
        
        for i in range(m):
            for j in range(n):
                if matrix[i][j] == 0:
                    matrix[i][0] = 0
                    matrix[0][j] = 0
                    
        #置零
        for i in range(1,m):
            for j in range(1,n):
                if matrix[i][0] == 0 or matrix[0][j] == 0:
                    matrix[i][j] = 0
        if row:
            for j in range(0,n):
                matrix[0][j] = 0
        if col:
            for i in range(0,m):
                matrix[i][0] = 0

感謝各位的閱讀,以上就是“Python多維列表中的坑如何解決”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python多維列表中的坑如何解決這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

文章名稱:Python多維列表中的坑如何解決
分享URL:http://bm7419.com/article2/psssic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、微信公眾號(hào)、自適應(yīng)網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)站收錄、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)