python - 如何使用 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
如何使用列表理解缩短此代码?
解决方案
首先要理解的是,列表推导从根本上是限制在 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]
推荐阅读
- c - 如何计算字典中单词中两个首字母的频率?
- algorithm - 如果 IP 在范围列表中,则过滤它们
- c++ - 预处理器宏的 G++ 未使用标签警告
- python - 使用颜色图绘制和保存散点图
- angular - MatOption如何模拟选择
- html - 在内部 alb 前端的同一 az 中,从 apache http 上的 html 页面调用内部 alb 后面的 tomcat 服务器上的 jsp
- react-native - Null 不是对象(评估“mapView.current.animateToRegion”)
- node.js - 意外的语法错误:无法使用导入
- sql - 使用 Redshift 查询结果为 to_char 格式
- javascript - 捕获 Stripe 支付意图