保留Python中两个JSON对象的重复条目

2024-06-17 12:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Lambda函数(python)中有两个JSON对象。我想将对象2中的键与对象1中的键进行比较,并删除对象1中不包含的任何项。你知道吗

每个对象中都有几百个项,因此嵌套for循环将花费太长时间。我找到了diffpy,但这需要一个模块导入到lambda中,我希望最好有一个本地python解决方案(以最小化lambda函数的大小)。你知道吗

object1 = [{'name': 'apple', 'price': 100}, {'name': 'grape', 'price': 
150}, {'name': 'orange', 'price': 40}]

object2 = [{'name': 'apple', 'price': 200}, {'name': 'grape', 'price': 
350}, {'name': 'orange', 'price': 40}, {'name': 'mango', 'price': 400}]

在上面的示例中,预期的newObject应该只有第一个对象的name key/value和两个对象的price key/value。对象2中的Mango不包含在对象1中,因此我们可以忽略它。你知道吗

newObject = [{'name': 'apple', 'priceA': 100, 'priceB': 200}, {'name': 
'grape', 'priceA': 150, 'priceB': 350}, {'name': 'orange', 'priceA': 40, 
'priceB': 40}]

我尝试使用以下代码来实现:

newHash= {}
newObject = []
for item in object1:
    name = item["name"]
    priceA = item["price"]
    for item in object2:
        if name == item["name"]:
            newHash["name"] = item["name"]
            newHash["priceA"] = priceA
            newHash["priceB"] = item["price"]
            newObject.append(newHash)

Tags: 对象lambda函数nameappleforitemprice
2条回答

好吧,正如评论中已经提到的,这个问题有点不完整,因为我们不知道如果两个集合中都有相同的名称,并且价格不同,你想怎么做。你知道吗

如注释中所述,可以使用set对象及其.intersection()方法来获得所需的内容。你知道吗

lambda o1,o2: [x for x in o1 if x['name'] in set(y['name'] for y in o1). intersection (set(z['name'] for z in o2))]

在假设lambda的第一个参数优先的情况下,这应该是可行的。您可以将“o1中的x代表x”更改为“o2中的x代表x”,以使第二个版本优先。你知道吗

如果你想把价格不同但名称相同的东西排除在外,事情会变得更复杂一些。我不知道您的用例是什么,也不知道为什么对象是按原样构造的,但如果您这样做可能会更容易:

po1={x['name']:x['price'] for x in object1}
po2={x['name']:x['price'] for x in object2}
[{'name':x,'price':po1[x]} for x in set(po1).intersection (set(po2)) if po1[x]==po2[x]]

很明显,这不是lambda或单行程序,而是更灵活一些(例如,去掉if部分,使object1优先,而不是排除冲突的值)。你知道吗

除非您修改对象的结构,否则您显示的代码将尽可能地“优化”,因为您使用的是字典列表,因此无法删除嵌套循环,这些循环将遍历每个列表以找到正确的字典。你知道吗

考虑将这些名称用作object1object2中的键,即{'apple': 100, 'grape': 150}。通过这种方式,您将可以直接访问以找到公用密钥。输出的结构可以如您所愿。你知道吗

object1 = {'apple': 100,
           'grape': 150,
           'orange': 40}

object2 = {'apple': 200,
           'grape': 350,
           'orange': 40,
           'mango': 400}

common_keys = object1.keys() & object2.keys()

output = [{'name': key, 'priceA': object1[key], 'priceB': object2[key]}
          for key in common_keys]
print(output)
#  [{'name': 'apple', 'priceA': 100, 'priceB': 200},
#   {'name': 'grape', 'priceA': 150, 'priceB': 350},
#   {'name': 'orange', 'priceA': 40, 'priceB': 40}]

相关问题 更多 >