Python为生成器表达式中使用的条件连接字符串

时间:2017-08-01 17:08:04

标签: python if-statement concatenation generator-expression

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

以下工作正常:

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)

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

所以你知道是否有办法使这种连接有效吗?

2 个答案:

答案 0 :(得分:1)

字符串不是可执行代码。 Python不会查看字符串并在可能的情况下执行它。你需要以不同的方式表达你的条件。

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

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

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

然后在map() call中使用该条件将条件应用于每个字典:

sum(map(condition, Sales_Store))

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

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序列的测试取决于您。例如,您可以使用字典将用户友好的字符串映射到函数,并让最终用户决定。

答案 1 :(得分:-1)

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