Python 列表理解,值(如果不在第二个列表中)
如果每周存在于Python 列表理解,值(如果不在第二个列表中),python,Python,如果每周存在于saleselse 0中,是否可以使用列表理解来获取每周的销售额 weeks = [{'week': 31}, {'week': 32}, {'week': 33}, {'week': 34}, {'week': 35}, {'week': 36}] weeks = [x['week'] for x in weeks] sales = [ {'week': 32, 'sales': 1167.26}, {'week': 33, 'sales'
sales
else 0中,是否可以使用列表理解来获取每周的销售额
weeks = [{'week': 31}, {'week': 32}, {'week': 33},
{'week': 34}, {'week': 35}, {'week': 36}]
weeks = [x['week'] for x in weeks]
sales = [
{'week': 32, 'sales': 1167.26},
{'week': 33, 'sales': 1373.61},
{'week': 36, 'sales': 1491.43},
]
expected = [0, 1167.26, 1373.61, 0, 0, 1491.43]
您可以从
sales
创建一个字典,用作weeks
中每周的查找:
weeks = [{'week': 31}, {'week': 32}, {'week': 33},
{'week': 34}, {'week': 35}, {'week': 36}]
sales = [
{'week': 32, 'sales': 1167.26},
{'week': 33, 'sales': 1373.61},
{'week': 36, 'sales': 1491.43},
]
_sales = {i['week']:i['sales'] for i in sales}
results = [_sales.get(i['week'], 0) for i in weeks]
输出:
[0, 1167.26, 1373.61, 0, 0, 1491.43]
如果您保证任何给定的
周
值只有一个销售
元素,则您可以获得一系列销售值,并将其相加以获得任何给定周的值:
out=[
总额(如果销售['周]==周,则销售中销售的销售['销售])
周而复始
]
如果对于任何给定的周数
在销售
中有多个条目,则它们的结果将相加以生成销售输出的合计值
这为您提供了一个具有所需输出的单一列表理解:
输出:
[0, 1167.26, 1373.61, 0, 0, 1491.43]
[01167.26、1373.61、0、0、1491.43]
比如说,创建一个周数到销售额的中间映射,比如
week_sales = {s['week']: s['sales'] for s in sales}
expected = [week_sales.get(w['week'], 0) for w in weeks]
如果您可以使用像pandas这样的第三方库
import pandas as pd
weeks = [{'week': 31}, {'week': 32}, {'week': 33},
{'week': 34}, {'week': 35}, {'week': 36}]
df1=pd.DataFrame(weeks)
sales = [
{'week': 32, 'sales': 1167.26},
{'week': 33, 'sales': 1373.61},
{'week': 36, 'sales': 1491.43},
]
df2=pd.DataFrame(sales)
df1.merge(df2,how='left').fillna(0)
输出
week sales
31 0.00
32 1167.26
33 1373.61
34 0.00
35 0.00
36 1491.43
[0, 1167.26, 1373.61, 0, 0, 1496.43]
如果您在同一周的销售列表中有多个条目
import pandas as pd
weeks = [{'week': 31}, {'week': 32}, {'week': 33},
{'week': 34}, {'week': 35}, {'week': 36}]
df1=pd.DataFrame(weeks)
sales = [
{'week': 32, 'sales': 1167.26},
{'week': 33, 'sales': 1373.61},
{'week': 36, 'sales': 1491.43},
{'week': 36, 'sales': 5},
]
df2=pd.DataFrame(sales)
pd.DataFrame(df1.merge(df2,how='left').fillna(0).groupby('week')['sales'].sum(name='sales'))
week sales
31 0.00
32 1167.26
33 1373.61
34 0.00
35 0.00
36 1496.43
受@Ajax1234解决方案的启发,如果您在一周内有多个销售价值,您可以创建一个包含分组价值的dict
weeks = [{'week': 31}, {'week': 32}, {'week': 33},
{'week': 34}, {'week': 35}, {'week': 36}]
sales = [
{'week': 32, 'sales': 1167.26},
{'week': 33, 'sales': 1373.61},
{'week': 36, 'sales': 1491.43},
{'week': 36, 'sales': 5},
]
sales_dict={}
for i in sales:
if i['week'] in sales_dict:
sales_dict[i['week']]=sales_dict[i['week']]+i['sales']
else:
sales_dict[i['week']]=i['sales']
[sales_dict.get(i['week'],0) for i in weeks] # sales_dict= {32: 1167.26, 33: 1373.61, 36: 1496.43}
输出
week sales
31 0.00
32 1167.26
33 1373.61
34 0.00
35 0.00
36 1491.43
[0, 1167.26, 1373.61, 0, 0, 1496.43]
销售
中的所有项目是否保证在周
中有匹配的项目?@PatrickHaugh在示例中没有。您尝试了哪些不起作用的内容?@PatrickHaugh是的所有销售
周必须存在于周
中它们是否始终都会被排序?如果销售['week',则销售中销售的金额('sale['sales']==周)
更具可读性。我喜欢这个解决方案,但如果销售列表在同一周有多个条目,会发生什么情况。我知道OP没有澄清这一点。