这是一个题目衍生出来的思考,题目是领扣(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进行数据分析》一书的第三章内容
本文介绍了如何利用Python的列表推导式、字典推导式和集合推导式来简化代码,提高效率。通过一道力扣(LeetCode)上的问题为例,展示了列表推导式的应用,并提供了多个示例,包括嵌套推导式。提醒在使用三层及以上嵌套时要注意代码可读性。
721

被折叠的 条评论
为什么被折叠?



