【问题标题】:How to implement logic on list of dictionaries based on multiple key value pairings?如何实现基于多个键值对的字典列表逻辑?
【发布时间】:2021-09-09 15:52:58
【问题描述】:

我在下面有一个字典列表:

d_dict = [
    {'Abs Diff': 10,'Difference':10, 'Component': 'Local Market', 'Id':'123', 'Name': 'LAT', 'Executor':'AB'}, 
    {'Abs Diff': 20,'Difference':20, 'Component': 'Local Market', 'Id':'123', 'Name': 'LAT', 'Executor':'B'},
    {'Abs Diff': 30,'Difference':-30, 'Component': 'Local Market', 'Id':'123', 'Name': 'LAT', 'Executor':'BA'},
    {'Abs Diff': 23,'Difference':23, 'Component': 'USD Market', 'Id':'456', 'Name': 'LAT', 'Executor':'CB'}, 
    {'Abs Diff': 25,'Difference':25, 'Component': 'USD Market', 'Id':'456', 'Name': 'LAT', 'Executor':'C'},
    {'Abs Diff': 48,'Difference':-48, 'Component': 'USD Market', 'Id':'456', 'Name': 'LAT', 'Executor':'CB'},
    {'Abs Diff': 5,'Difference':5, 'Component': 'Price', 'Id':'123', 'Name': 'LAT', 'Executor':'AB'}, 
    {'Abs Diff': 5,'Difference':5, 'Component': 'Price', 'Id':'123', 'Name': 'LAT', 'Executor':'B'},
    {'Abs Diff': 10,'Difference':-10, 'Component': 'Price', 'Id':'123', 'Name': 'LAT', 'Executor':'BA'}
    ]

我的最终目标是有一个返回的字典:

result = [
    {'Abs Diff': 10,'Difference':10, 'Component': 'Local Market', 'Id':'123', 'Name': 'LAT', 'Executor':'AB', 'Result':'Mismatched Executor'}, 
    {'Abs Diff': 20,'Difference':20, 'Component': 'Local Market', 'Id':'123', 'Name': 'LAT', 'Executor':'B', 'Result':'Mismatched Executor'},
    {'Abs Diff': 30,'Difference':-30, 'Component': 'Local Market', 'Id':'123', 'Name': 'LAT', 'Executor':'BA', 'Result':'Mismatched Executor'},
    {'Abs Diff': 23,'Difference':23, 'Component': 'USD Market', 'Id':'456', 'Name': 'LAT', 'Executor':'CB', 'Result':'Mismatched Executor'}, 
    {'Abs Diff': 25,'Difference':25, 'Component': 'USD Market', 'Id':'456', 'Name': 'LAT', 'Executor':'C', 'Result':'Mismatched Executor'},
    {'Abs Diff': 48,'Difference':-48, 'Component': 'USD Market', 'Id':'456', 'Name': 'LAT', 'Executor':'CB', 'Result':'Mismatched Executor'},
    {'Abs Diff': 5,'Difference':5, 'Component': 'Price', 'Id':'123', 'Name': 'LAT', 'Executor':'AB', 'Result':'Mismatched Executor'}, 
    {'Abs Diff': 5,'Difference':5, 'Component': 'Price', 'Id':'123', 'Name': 'LAT', 'Executor':'B', 'Result':'Mismatched Executor'},
    {'Abs Diff': 10,'Difference':-10, 'Component': 'Price', 'Id':'123', 'Name': 'LAT', 'Executor':'BA', 'Result':'Mismatched Executor'}
]

我想实现一个逻辑: 如果 Abs Diff 大于 0 并且如果组件、id、name 跨多个元素匹配,并且如果相同元素之间的差异之和小于 1 并且执行器在这些元素之间不同,则返回新的键值对“结果”:“不匹配”

我无法想象如何扫描列表中的多个字典并检查匹配的组件、ID 和名称。

【问题讨论】:

  • 所有结果都显示不匹配
  • 您可以使用 itertools.groupby 和一个键来选择您想要相同的元素
  • @Barmar 基于逻辑,每一个都应该根据组件、id和名称的分组不匹配(9个元素上的3个唯一分组)
  • 如果您的示例还包括它们不不匹配的情况,那将会很有帮助。
  • 虽然看起来@Barmar 和另一个用户要为你编写一些代码,但“告诉我如何解决这个编码问题”是off-topic for Stack Overflow。我们希望您发送honest attempt at the solutionI downvoted your question because no attempt was made.

标签: python dictionary if-statement


【解决方案1】:

调用sum(),使用生成器查找所有符合条件的字典。

for i in d_dict:
    if i['Abs Diff'] > 0 and \
        sum(x['Difference'] for x in d_dict 
            if (x['Component'], x['Id'], x['Name']) == (i['Component'], i['Id'], i['Name']) and x['Executor'] != i['Executor']
        ) < 1:
        i['Result'] = 'Mismatched Executor'

【讨论】:

  • 不幸的是,这并没有考虑到字典中的所有元素。
  • 哪些不考虑?
  • 它将所有具有相同组件、ID 和名称以及不同执行器的字典相加。
  • 运行上面的字典时我看到的结果是 {'Abs Diff': 30, 'Difference': -30, 'Component': 'Local Market', 'Id': '123 ', 'Name': 'LAT', 'Executor': 'BA'} no "result": "mismatched executor"
【解决方案2】:

这是我如何解决此问题的示例

from operator import itemgetter

newdict = []
for i in d_dict:
    if(i['Abs Diff'] > 0):
        newdict.append(i)
newlist = sorted(newdict, key=itemgetter('Component'))         
for i in range(0,len(d_dict)-1):
    if(d_dict[i]['Component'] == d_dict[int(i+1)]['Component']):
        print("TRUE")
        

【讨论】:

  • 按组件、ID、名称分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多