【python】列表、字典、集合推导式

本文介绍了如何利用Python的列表推导式、字典推导式和集合推导式来简化代码,提高效率。通过一道力扣(LeetCode)上的问题为例,展示了列表推导式的应用,并提供了多个示例,包括嵌套推导式。提醒在使用三层及以上嵌套时要注意代码可读性。

这是一个题目衍生出来的思考,题目是领扣(LeetCode)上面的:

给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
示例 1:
输入: J = “aA”, S = “aAAbbbb”
输出: 3
示例 2:
输入: J = “z”, S = “ZZ”
输出: 0
注意:
S 和 J 最多含有50个字母。
J 中的字符不重复。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jewels-and-stones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这是一个很简单的题,我是用很蠢的方法实现的:

class Solution:
    def numJewelsInStones(self, J: str, S: str) -> int:
        s_list = list(S)
        j_list = list(J)
        num = 0
        for i in s_list:
            if i in j_list:
                num += 1
        return num

说白了就是硬生生的数嘛,感觉代码很长又很慢。到评论区转了一圈,发现很多大佬的解答只需要用一行就实现了。主要是用到了列表推导式或者称为列表生成器,下面是大佬的代码:

class Solution:
    def numJewelsInStones(self, J: str, S: str) -> int:
    	return len([i for i in S if i in J])

这里采用到了列表推导式。列表推导式的一般语法是:
[expr for val in collection if condition]
上面的语法等同于:

result = []
for val in collection:
    if condition:
        result.append(expr)

写完感觉真的是神清气爽,真的超级简单。
举一个例子,我们如果要将一个列表中的字符串,长度大于3的转化成大写的话,可以这样写:

a = ['this', 'is', 'a', 'test']
change_a = [i.upper() for i in a if len(i)>2]

字典推导式和集合推导式类似,只需要写入键-值对,把方括号换成大括号就行。
推导式还可以进行嵌套,比如下面这个例子:
有一个列表,里面有些名字,分别是英语和西班牙语。需要将这些名字中,所有出现'e'的次数大于2的名字存放在一个列表name_r中。那么可以这样写:

all_data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'], ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
name_r = [name for names in all_data for name in names if name.count('e')>=2 ]

注意,虽然列表推导式能够让你的代码看起来很简洁,但是如果出现3个及以上的for的时候(三层嵌套的时候)就需要考虑代码的可读性了。
更多关于列表推导式的内容可以参考《使用python进行数据分析》一书的第三章内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值