繁体   English   中英

如何从python中的列表中删除json字符串而不会丢失数据

[英]How to remove a json string from list in python without losing data

我的问题类似于SO 如何从列表中删除json字符串中的另一个问题。 该问题的解决方案确实解决了我的部分问题,但我的情况几乎没有什么不同。

我的清单是:

list1 = [{"ID": 1, "data": "12"},{"ID": 2, "data": "13"}]
list2 = [{"ID": 1, "col": "5"},{"ID": 1, "col": "8"},{"ID": 2,"col": "2"}]

我做了以下修改最终列表:

per_id = {}
for info in chain(list1, list2):
    per_id.setdefault(info['ID'], {}).update(info)

output = list(per_id.values())

预期输出为:

output = [{"ID": 1,"data": "12", "col": "5"},{"ID": 1,"data": "12", "col": "8"},{"ID": 2,"data": "13","col": "2"}]

但是我得到的输出是:

output = [{"ID": 1,"data": "12", "col": "5"},{"ID": 2,"data": "13","col": "2"}]

有没有办法纠正此问题。

之所以获得第二个版本,是因为存在多个“ ID”,其值均为1。如果对列表使用defaultdict ,则可以将其设置为追加。

该示例直接从页面获取:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

如果您的一个列表包含一个ID的某些属性,而另一个列表包含其他属性,则链接可能不是最佳方法。

在这里,您可以简单地分别迭代两个列表,并用第二个列表的映射更新一个列表的映射。 python控制台中的代码示例:

>>> result = []  # start with an empty list 
>>> for elt1 in list1:
        for elt2 in list2:
            if elt1['ID'] == elt2['ID']:
                eltr = elt1.copy()  # take a copy to avoid changing original lists
                eltr.update(elt2)
                result.append(eltr)

>>> result
[{'data': '12', 'ID': 1, 'col': '5'}, {'data': '12', 'ID': 1, 'col': '8'}, {'data': '13', 'ID': 2, 'col': '2'}]

如预期...

尝试itertools-combinations-

from itertools import chain
from itertools import combinations

list1 = [{"ID": 1, "data": "12"},{"ID": 2, "data": "13"}]
list2 = [{"ID": 1, "col": "5"},{"ID": 1, "col": "8"},{"ID": 2,"col": "2"}]


data = []
for i,j in combinations(chain(list1,list2),2):
    if i['ID'] == j['ID']:
        d = dict(i.items()+j.items())
        if len(d.keys())==3:#Ensure that it has three keys i.e. avoid combination between lsit1 elements or combination between list2 elements themselves.
            data.append(d)
print data

输出 -

[{'data': '12', 'ID': 1, 'col': '5'}, {'data': '12', 'ID': 1, 'col': '8'}, {'data': '13', 'ID': 2, 'col': '2'}]

如果您包括一个简单的检查以避免重复值,那么Serge Ballesta的上一个答案将起作用(我会对此进行评论,但是我没有足够的声誉)。

result = [] # start with an empty list

for elt1 in list1:
    for elt2 in list2:
        if elt1['ID'] == elt2['ID']:
            for k in elt2.keys():
                if k != "ID":
                    eltr = elt1.copy()  # take a copy to avoid changing original lists
                    eltr.update(elt2)
                    result.append(eltr)

result

输出:

[{'data': '12', 'ID': 1, 'col': '5'}, {'data': '12', 'ID': 1, 'col': '8'}, {'data': '13', 'ID': 2, 'col': '2'}]    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM