【问题标题】:Conditional list generation from two different lists in Python从 Python 中的两个不同列表生成条件列表
【发布时间】:2026-01-20 10:35:01
【问题描述】:

提前道歉,因为我对这一切都很陌生,我不确定所有内容的正确条款。

我有两个列表之间的差异列表,称为Change。我想生成一个百分比变化列表Percentage,方法是将Change 中的每个值除以它引用的列表(BeforeAfter)中相应值的最大值。如果使用了错误的值,在某些情况下百分比变化会显示为 -660%。

BeforeAfter 是通过 PIL 从图像文件生成的,但输出的一小部分如下。

Before = [135,160,199,]
After = [146,174,176,]
Change = list(After-Before for Before,After in zip(Before,After))
PercentageA = list(Change/After*100 for After,Change in zip(After,Change))
PercentageB = list(Change/Before*100 for Before,Change in zip(Before,Change))
for x in Change:
    if x <0:
        Percentage = PercentageA
    else:
        Percentage = PercentageB
    print(Percentage)

此代码生成:

In [1]:
[8.148148148148149, 8.75, -11.557788944723619]
[8.148148148148149, 8.75, -11.557788944723619]
[7.534246575342466, 8.045977011494253, -13.068181818181818]

但是,结果应该是:

[7.534246575342466, 8.045977011494253, -11.557788944723619]

我的主要问题是;对于列表中的每个值,如何将Change 除以BeforeAfter 的最大值生成Percentage 列表?

编辑:减少和概括了一些代码,并删除了背景。为提供太多背景而道歉。 Edit2:很抱歉误解了我的要求。

【问题讨论】:

    标签: python list


    【解决方案1】:

    你计算错了——这行得通:

    # list must be same lenght for zip() to work
    before  = [135, 199]
    after   = [146, 176]
    change  = [ 11, -23]
    
    print(f"{'before':<10} {'after':<10} {'percent':<10} {'change':<10}")
    
    for b,a,c in zip(before, after, change):
        print (f'{b:<10} {a:<10} {c/max(b,a)*100:<10.6} {c:<10}')
    

    输出:

    before     after      percent    change    
    135        146        7.53425    11
    199        176        -11.5578   -23
    

    压缩 3 个列表会从该代码迭代的每个列表中创建元组。见 f.e. The zip() function in Python 3

    【讨论】:

    • 非常感谢 - 这实际上帮助我修复了它!很抱歉不知道布局的正确方法,但这非常有帮助。
    最近更新 更多