Python之列表解析

本文详细介绍了Python列表解析的作用和语法,并通过两个LeetCode问题——17. Letter Combinations of a Phone Number和46. Permutations,展示了列表解析在解决实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、作用及语法

  • 作用:根据已有列表高效创建列表

  • 语法:

    1. [expression for iter_val in iterable]

      • expression 指的是表达式,表达式中应对iter_val进行操作
      • for iter_val in iterable的意思是,将列表iterable中的元素一一取出为iter_val
      • 最终各个iter_val经过expression操作后得到的各个值作为新列表的元素
    2. [expression for iter_val in iterable if cond_expr]

      • if后面的cond_expr为真的话,才取出iter_val,比如:
13 >>>L = [ i**2 for i in range(1,11) if i >= 4 ]
14 >>>print L
15 [16, 25, 36, 49, 64, 81, 100]

二、Leetcode应用

17. Letter Combinations of a Phone Number

方法一、非递归
class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        
        if digits == '':
            return []
        
        dict = {'2': 'abc', '3': 'def',
                '4': 'ghi','5': 'jkl', '6': 'mno',
                '7': 'pqrs','8': 'tuv', '9': 'wxyz',
               }

        # 列表解析,不断输出字典中对应的键值到i,由i作为新的列表元素
        cur = [i for i in dict[digits[0]]]   
        
        #之前是用digits的长度进行遍历,但其实可以直接用digits中的值进行遍历
        #这样可以简化,直接用i就可以取字典中的值
        for i in digits[1:]:   
            cur = [c+p for c in cur for p in dict[i]]
            # 实现两个列表中的元素c和p逐一配对,并输出c+p

        return cur
  • 结果
    在这里插入图片描述
方法二、递归
class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        
        if digits == '':
            return []
        
        dict = {'2': 'abc', '3': 'def',
                '4': 'ghi','5': 'jkl', '6': 'mno',
                '7': 'pqrs','8': 'tuv', '9': 'wxyz',
               }
        
        # 递归返回条件
        if len(digits) == 1:
            return [i for i in dict[digits[0]]]
        
        #直接递归,digits的第一个元素组成列表m,digits的第二至end元素的映射组成列表n,然后m和n注意配对,输出m+n
        return [m+n  for m in dict[digits[0]] for n in self.letterCombinations(digits[1:])]  

46. Permutations

方法一、递归(递归方法从最后的值开始插值;非递归方法则相反,由第一个数开始插值)
class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        
        if nums == []:
            return []
        
        if len(nums) == 1:
            return [nums]
        
        temp = []
        for i in self.permute(nums[1:]):
            for j in range(len(nums)):
                cur = i[:]   # 因为python的赋值实际上是赋值指针(浪费了我好多时间debug),所以要用切片复制出新的一个列表
                cur.insert(j,nums[0])
                temp.append(cur)

        return temp
方法一改善:
class Solution(object):
    def insert_num(self,m,n,z):
        cur = m[:]   #注意要切片复制出新列表
        cur.insert(n,z)
        return cur
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        
        if nums == []:
            return []
        
        if len(nums) == 1:
            return [nums]
            
         # 运用了列表解析,与上一题类似
        return [self.insert_num(m,n,nums[0]) for m in self.permute(nums[1:]) for n in range(len(nums))] 
  • 结果
    在这里插入图片描述
方法二、借助现成模块
class Solution(object):

    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        import itertools
        return list(itertools.permutations(nums,len(nums)))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值