生活不易 我用python我的python学习道路

关于python中分片表达式和列表解析式的使用

2018-07-04  本文已影响25人  fred_33c7

leetcode中有一道题,大意是将句子按照空格分割,然后每个分割成的字母反写,比如:

Input: "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"

这道题思路很简单,1.分割 2.反写 3.返回
但是在具体写代码的时候,有一些技巧可以简化代码。

def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        list = s.split(' ')
        for n,item in enumerate(list):
            list[n] = ''.join(item[::-1])
        return ' '.join(list)

这是我一开始写的代码,用了for循环,很常见的写法,一般用到这种迭代结构,很容易想到循环语句。其中,反写,用了[::-1]这种分片表达式的写法。
for循环很常见,但是如果有2层,甚至3层的时候,很容易把自己都搞糊涂了。比如leetcode821题https://www.jianshu.com/p/20c0423a9e8a我的这篇文章中的第一种写法,用了2层for循环,很容易看的混乱。
这时候,用列表解析式就更简单,不容易混乱。

列表解析式是python中的一个亮点语法。本质上就是用列表来构建列表,通过对已有列表中的每一项应用一个指定的表达式来构建出一个新的列表。列表解析式的优势是编码简单,运行起来很快。

列表解析式的三个核心要素是:
1.作用于输入序列的运算表达式;
2.对输入序列的循环表达式;
3.对输入序列的过滤条件,其中过滤条件是可选的。

比如我们想要用列表a生成列表b,其中列表b中的每个元素都是a中对应元素的二次方
代码片段:

a = [1,2,3,4,5,6,7,8,9,10]
b = [x**2 for x in a]
print(b)

运行结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

所以,开头这道题,可以简化的写法:

list_c = []
        for index, item in enumerate(S):
            if C == item:
                list_c.append(index)
        list_return = []
        for index, item in enumerate(S):
            distance = [abs(index - index_list) for index_list in list_c]
            list_return.append(min(distance))
        return list_return

那就简单了,很容易理解,不过要注意的是,分片表达式是产生一个全新的列表。

上一篇下一篇

猜你喜欢

热点阅读