Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解,值(如果不在第二个列表中)_Python - Fatal编程技术网

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没有澄清这一点。