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

时间:2015-11-26 09:53:07

标签: python json list

我的问题类似于SO How to remove a json string from list中的另一个问题。 这个问题的解决方案确实解决了我的一部分问题,但我的问题却没有什么不同。

我的名单是:

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"}]

有没有办法解决这个问题。

4 个答案:

答案 0 :(得分:0)

您获得第二个版本,因为有多个“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])]

答案 1 :(得分:0)

如果您有一个列表包含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'}]

正如所料......

答案 2 :(得分:0)

尝试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'}]

答案 3 :(得分:0)

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'}]