计算 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*
和变化量在 previous
和 current
列表之间(仅当差异不为 0 时)
例如:
('A4', 100)
我有两组不同的列表,新列表总是有新值,我想知道值改变了多少?
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*
和变化量在 previous
和 current
列表之间(仅当差异不为 0 时)
例如:
('A4', 100)