首页 > 解决方案 > 如何使用 python 列表理解缩短此代码?

问题描述

我正在尝试对此进行编码,

def retrieve_smallest_letter(words):
"""
Input: 'words' (lst) which represents a list of strings.
Output: A new list with the smaller letter of the each word's 
          first and last index value compared to be appended to the list.
For Example:
>>> lst = ['sandbox', 'portabello', 'lion', 'australia', 'salamander']
>>> retrieve_smallest_letter(lst)
['s', 'o', 'l', 'a', 'r']
"""

我的代码

def retrieve_smallest_letter(words):
    lst = []
    for i in range(len(words)):
        first_word = words[i][0]
        last_word = words[i][len(words[i])-1]
        if first_word < last_word:
            lst.append(str(first_word))
        else:
            lst.append(str(last_word))

    return lst

如何使用列表理解缩短此代码?

标签: pythonlist

解决方案


首先要理解的是,列表推导从根本上是限制在 for 循环上的语义:

r = [a for a in b if c]

本质上是语法糖

r = []
for a in b:
    if c:
        r.append(a)

所以第一步是将问题转化为适合列表理解的“形状”:

  • 简单的迭代和过滤
  • 没有分配(因为目前还不支持)
  • 只有一个生产

正确使用 Python 也有帮助,让我们从简化现有循环开始:

  • 直接迭代集合,Python 有一个强大的迭代器协议,除非绝对必要,否则您通常不会通过索引进行迭代
  • 对单词使用索引或解构,Python 允许从末尾开始索引(使用负索引)
  • 将选择“内联”作为单个表达式执行,使用条件表达式或在这种情况下使用完全满足需要的内置函数min
def retrieve_smallest_letter(words):
    lst = []
    for word in words:
        lst.append(min(word[0], word[-1]))

    return lst

或者

def retrieve_smallest_letter(words):
    lst = []
    for first, *_, last in words:
        lst.append(min(first, last))

    return lst

从那里开始,转换是微不足道的(没有过滤,因此可以忽略):

def retrieve_smallest_letter(words):
    return [min(first, last) for first, *_, last in words]

推荐阅读