0

我有一组生成器表达式的条件,它们会有所不同,如果可能的话,我想尝试将条件连接为字符串,并在生成器表达式中使用这个字符串变量:

以下工作正常:

Total = sum(sale["Date"] == date for sale in Sales_Store)

其中 date 是一个整数,Sales_Store 是具有相同键的字典列表,“Date”是键名之一。它返回满足此条件的销售商店中的销售数量。

但这会产生错误:+ 的不支持的操作数类型:'int' 和 'str'

strTest = "sale[\"Date\"] == date for sale in Sales_Store"
Total = sum(strTest)

当然,如果某个其他条件成立,我只希望在生成器表达式中使用此条件,并且有几个其他条件可以与此连接,每个条件仅适用于某些情况。

那么你知道是否有办法使这种串联工作?

4

2 回答 2

1

字符串不是可执行代码。如果可能的话,Python 不会查看字符串并执行它。您需要以不同的方式表达您的条件。

你可以创建一个函数,给定一个字典返回一个布尔值;lambda对于一个简单的表达式,您可以使用以下语法创建该函数:

condition = lambda d: d['Date'] == date

对于较大的测试,您可以使用def condition(d):函数定义并使用多个语句等。函数是可执行的表达式!

然后在map()调用中使用它来将条件应用于每个字典:

sum(map(condition, Sales_Store))

如果您需要动态更改条件,则构建一系列测试,并使用any()orall()函数将这些测试组合起来:

conditions = (test1, test2, test3)
all_conditions = lambda d: all(t(d) for t in conditions)
any_condition = lambda d: any(t(d) for t in conditions)

all_conditions_sum = map(all_conditions, Sales_Store)
any_conditions_sum = map(any_conditions, Sales_Store)

正如您可能从函数名称中看出的那样,如果其中一个测试为真,如果所有any()测试都为真,则将返回。Trueall()

如何选择测试进入conditions序列取决于您。例如,您可以使用字典将用户友好的字符串映射到函数,然后让最终用户决定。

于 2017-08-01T17:15:31.150 回答
-1

您是否尝试过 int() 函数在加法之前将所有内容转换为整数?

于 2017-08-01T17:14:02.883 回答