计算 Python 中两个不同列表的差异

Calculating Difference from two different lists in Python

我有两组不同的列表,新列表总是有新值,我想知道值改变了多少?

previous=[ [525, 'test', 'A3'],[522, 'test', 'A4']]

current = [ [525, 'test', 'A3'],[622, 'test', 'A4'],[320, 'test', 'A5']]

对于 A4,差异为 100 如何计算出差异?

期望的输出:

 A4 = 100
 A5 = 320

这可能是一个粗略的解决方法,我同意字典可能是更好的选择,但如果您坚持使用列表:

previous=[ [525, 'test', 'A3'],[522, 'test', 'A4']]

current = [ [525, 'test', 'A3'],[622, 'test', 'A4'],[320, 'test', 'A5']]


for i in range(len(current)):
    if i >= len(previous):
        print(str(current[i][2]) + " = " + str(current[i][0]))
    else:    
        if current[i][0]-previous[i][0]!=0:
            print(str(current[i][2])+" = "+ str(current[i][0]-previous[i][0]))

A4 = 100
A5 = 320

如果顺序完全改变(也就是说,如果您是插入而不是追加),这一切都会崩溃。可能还有简化的方法,但这是我考虑到场景的第一件事。

使用pandas

import pandas as pd
previous=[ [525, 'test', 'A3'],[522, 'test', 'A4']]
df1= pd.DataFrame(previous,columns=['Score','test','name']) # creat a dataframe

current = [ [525, 'test', 'A3'],[622, 'test', 'A4'],[320, 'test', 'A5']]
df2 = pd.DataFrame(current,columns=['Score','test','name']) # create another dataframe

df3 =df2.merge(df1,how='left',  on='name').fillna(0) # perform left join on key='name'

df3['diff']=df3['Score_x']-df3['Score_y'] # find the difference

df3[['name','diff']] # print the difference with current and previous

输出

name    diff
A3      0.0
A4      100.0
A5      320.0

进一步细化: 如果你不想用diff=0显示结果,那么

df3[(df3['diff'] != 0)][['name','diff']]

输出

name    diff
A4     100.0
A5     320.0

如果你需要最终结果作为字典

df3[(df3['diff'] != 0)][['name','diff']].to_dict('records')

输出

[{'name': 'A4', 'diff': 100.0}, {'name': 'A5', 'diff': 320.0}]

使用字典,d,如 CMMCD 所建议:

>>> previous=[ [525, 'test', 'A3'],[522, 'test', 'A4']]
>>> current = [ [525, 'test', 'A3'],[622, 'test', 'A4'],[320, 'test', 'A5']]
>>> d = {a[2]: a[0] for a in previous}
>>> for data, _, key in current:
    if key not in d:
        print(key, '=', data)
    elif data != d[key]:
        print(key, '=', data-d[key])


A4 = 100
A5 = 320
>>> 

此代码可以解决您的问题(我按照 Chris Charley 的想法使用字典,以便将键 A3, A4, ... 映射到 previous 变量中每个条目的整数值) .

from operator import itemgetter

previous=[ [525, 'test', 'A3'],[522, 'test', 'A4']]
current = [ [525, 'test', 'A3'],[622, 'test', 'A4'],[320, 'test', 'A5']]

def differences():
    d = dict(map(itemgetter(2, 0), previous))
    for key, value in map(itemgetter(2, 0), current):
        difference = abs(d.get(key, 0) - value)
        if difference > 0:
            yield key, difference

output = dict(differences())

输出将是:

{'A4': 100, 'A5': 320}

differences() 它是一个生成器函数,returns 对于 current 列表中的每个条目,一个包含两项的元组:键 A* 和变化量在 previouscurrent 列表之间(仅当差异不为 0 时) 例如: ('A4', 100)