python - 如何循环浏览已定义的元素列表
问题描述
我有一个大型列表字典,它是作为更大的 python 程序的一部分动态生成的。这是字典的外观示例
params = {
'output': ['quantity_tot_1m', 'quantity_tot_3m', 'quantity_tot_6m',
'quantity_tot_12m', 'quantity_tot_full', 'cost_tot_1m', 'cost_tot_3m', 'cost_tot_6m', 'cost_tot_12m', 'cost_tot_full', 'selling_tot_1m',
'selling_tot_3m', 'selling_tot_6m', 'selling_tot_12m', 'selling_tot_full', 'profit_tot_1m', 'profit_tot_3m', 'profit_tot_6m', 'profit_tot_12m', 'profit_tot_full'],
'agg_types': ['By SKU - 01 Month','By SKU - 03 Months','By SKU - 06 Months','By SKU - 12 Months']
}
我需要帮助才能循环浏览这些列表
我已经尝试过以下
from jinjasql import JinjaSql
j = JinjaSql(param_style='pyformat')
QUERY_TEMPLATE = """
{% set mix_agg = agg_types|replace("[","")|replace("]","") %}
{% set mix_agg2 = cycler(mix_agg) %}
{% for o in output %}
ROUND(CAST(SUM(CASE WHEN agg_type = '{{ mix_agg2.next() | sqlsafe }}' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS {{o | sqlsafe}} {% endfor%}
"""
query, bind_params = j.prepare_query(QUERY_TEMPLATE, params)
print(query)
这不会循环遍历列表,它只是按原样输出列表。当然,我不能将列表显式输入循环器,因为这必须是动态的。
也许 acycler()
不是最好的方法,但我需要如下输出:
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 01 Month' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_1m,
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 03 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_3m,
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 06 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_6m,
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 12 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_12m
不是这样的:
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 01 Month', 'By SKU - 03 Months', 'By SKU - 06 Months', 'By SKU - 12 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_1m,
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 01 Month', 'By SKU - 03 Months', 'By SKU - 06 Months', 'By SKU - 12 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_3m,
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 01 Month', 'By SKU - 03 Months', 'By SKU - 06 Months', 'By SKU - 12 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_6m,
ROUND(CAST(SUM(CASE WHEN agg_type = 'By SKU - 01 Month', 'By SKU - 03 Months', 'By SKU - 06 Months', 'By SKU - 12 Months' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS profit_tot_12m
共有20个输出列{{o | sqlsafe}}
解决方案
线
{% set mix_agg = agg_types|replace("[","")|replace("]","") %}
将数组类型转换为字符串,这只会使其以后更难使用,并且可能不是您想要的。
线
{% set mix_agg2 = cycler(mix_agg) %}
然后创建一个带有单个刺的循环器以循环通过 - 因此它将重复返回这个单个字符串。
要循环遍历数组,请使用 python*
运算符 - 它将数组转换为函数参数:
{% set mix_agg2 = cycler(*agg_types) %}
综上所述,我们有:
QUERY_TEMPLATE = """
{% set mix_agg2 = cycler(*agg_types) %}
{% for o in output %}
ROUND(CAST(SUM(CASE WHEN agg_type = '{{ mix_agg2.next() | sqlsafe }}' THEN profit_tot ELSE 0 END ) AS NUMERIC),2) AS {{o | sqlsafe}}
{% endfor %}
"""
此外:output
包括_tot_full
. agg_types
您可以通过在定义时添加agg_types
或删除它来解决此问题output
,或者添加 aif
以在循环中跳过它。
推荐阅读
- ios - 如何通过单击 TableCell 中的按钮将 TableCell 中的标签值传递给 TableViewController?
- vbscript - 使用 VBScript 通过电子邮件发送文件
- linux - 创建用户后无法 chdir 到主目录
- git - git squash 在使用 master 分支重新设置基础后提交?
- python - 如何在SDN控制器上实现冗余
- c - 函数 getgrgid() 被无人调用时返回 NULL
- python - django python:返回两页的推荐人
- c# - 为什么“委托”构造函数需要两个参数?
- android - Android TensorFlow 返回错误“找不到对象跟踪支持”
- asp.net - 使用 SQL Server 将数据从本地数据库同步到实时服务器