序列求值的同时转换(过滤)数据

Posted jeffrey-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列求值的同时转换(过滤)数据相关的知识,希望对你有一定的参考价值。

场景:需要执行缩减函数(例如,sum(),min(),max()),但首先需要转换或过滤数据。

通常可以使用生成器表达式进行数据的过滤,sum,min,max的参数为iterable,而generator继承iterator,iterator继承iterable。故生成器表达式同样可以作为这些函数的参数。
如下示例:

nums = [1, 2, 3, 4, 5]
s = sum(x * x for x in nums)

# Determine if any .py files exist in a directory
import os
files = os.listdir('dirname')
if any(name.endswith('.py') for name in files):
    print('There be python!')
else:
    print('Sorry, no python.')

# Output a tuple as CSV
s = ('ACME', 50, 123.45) 
print(','.join(str(x) for x in s))

# Data reduction across fields of a data structure
portfolio = [
    'name':'GOOG', 'shares': 50,
    'name':'YHOO', 'shares': 75,
    'name':'AOL', 'shares': 20,
    'name':'SCOX', 'shares': 65
]
min_shares = min(s['shares'] for s in portfolio)
# Output 20

使用生成器参数通常比首先创建临时列表更有效和更优雅。 例如,如果没有使用生成器表达式,则可以考虑使用此替代实现:

nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums])

这有效,但它引入了额外的步骤并创建了一个额外的列表。 对于小的列表,它可能没关系,但如果nums很大,最终会创建一个大的临时数据结构,只能使用一次并丢弃。 生成器解决方案迭代地转换数据,因此内存效率更高。
min(), max()和sorted()都有一个额外的参数key,可以定制化比较。如下所示:

# Original: Returns 20
min_shares = min(s['shares'] for s in portfolio)

# Alternative: Returns 'name': 'AOL', 'shares': 20
min_shares = min(portfolio, key=lambda s: s['shares'])

以上是关于序列求值的同时转换(过滤)数据的主要内容,如果未能解决你的问题,请参考以下文章

C语言关于表达式求值

操作符中表达式求值(隐式类型转换详解)以及操作符属性

C语言编程-逆波兰表达式求值

多项式函数插值:多项式形式函数求值的Horner嵌套算法

C语言编一个实现简单的算术表达式求值的代码。

表达式求值