【问题标题】:How to compare a list of dict with list of tuples in Python如何比较字典列表和Python中的元组列表
【发布时间】:2022-01-10 13:27:50
【问题描述】:

我有一个listdict 如下:

objList =   [{
            'Name': 'keyboard',
            'objectId': [0, 1],
            'StartTime': '2022-01-10T13:18:17.098119',
            'IsCompleted': False,
            'MetaData': [{
                'Count': 2
            }]
        }, {
            'Name': 'smallObjects',
            'objectId': [2, 3],
            'StartTime': '2022-01-10T13:18:33.950507',
            'IsCompleted': False,
            'MetaData': [{
                'Count': 2
            }]
        }]

和元组列表:

objectsCounter = [('keyboard', 2), ('smallObjects', 4)]

我必须编写一个 python 代码,如果大于或等于 objectsCounter 中的计数,我必须检查 MetaData 是否来自 dict(对于键盘和 smallObjects)objList。如果是,那么我必须将IsCompleted 设置为True,否则设置False。为此,我编写了下面的代码,并且工作正常

for obj1 in objList:
    for obj2 in objectsCounter:
        if obj2[0] == obj1['Name']:
            if obj2[1] >= obj1['MetaData'][0]['Count']:
                obj1['IsCompleted'] = True
                
            break

但是因为我使用了很多forif,我觉得必须有更好的方法来做这个比较。谁能帮我优化上面的代码或者上面的代码看起来不错。谢谢

【问题讨论】:

  • 如果你使用objectsCounter = {'keyboard': 2, 'smallObjects': 4}会更好。

标签: python python-3.x list dictionary tuples


【解决方案1】:

我认为您的解决方案效果很好,这是另一种方法。将您的objectsCounter 转换为字典,然后只循环一个列表

o=dict(objectsCounter )

for i in objList:
  #Matching your code
  i['IsCompleted']= o[i['Name']] >= i['MetaData'][0]['Count']

您只会循环浏览您需要的项目,即objList 中的项目。当您将isCompleted 的值设置为逻辑比较时,您也不需要if

要匹配描述而不是代码,只需更改操作符

      i['IsCompleted']= o[i['Name']] <= i['MetaData'][0]['Count']

【讨论】:

  • 我已经运行了你的代码,但不知道为什么,smallObjects IsCompleted 是真的吗?
  • @SAndrew 我重读了您的帖子,您描述的问题与您的代码略有不同。您列出的代码显示 True for smallObjects 并且您提到它有效。应该是哪个?在您的代码中,它是 true if obj2[1] &gt;= obj1['MetaData'][0]['Count'] obj2objectsCounter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多