Python 通过键连接字典

Python 通过键连接字典,python,dictionary,Python,Dictionary,我有一个字典列表(其中包含一些从API获取的数据),假设: 有多个字典在alist中重复。但只有一个键的值与重复字典中的值不同。因此,查询为: 通过在列表中保留单独的值来组合这些词典的最简单方法是什么 比如: 更新-我有一个列表,其中指定了重复的键,如: repeated_keys = ['c',...] 您可以使用列表: result = [alist[0].copy()] result[0]['c'] = [d['c'] for d in alist] 请注意,将此再次列为列表没有什么

我有一个字典列表(其中包含一些从API获取的数据),假设:

有多个字典在
alist
中重复。但只有一个键的值与重复字典中的值不同。因此,查询为:

通过在列表中保留单独的值来组合这些词典的最简单方法是什么

比如:

更新-我有一个列表,其中指定了重复的键,如:

repeated_keys = ['c',...] 

您可以使用列表:

result = [alist[0].copy()]
result[0]['c'] = [d['c'] for d in alist]
请注意,将此再次列为列表没有什么意义;毕竟,您将所有内容合并到一本词典中:

result = dict(alist[0], c=[d['c'] for d in alist])
如果有多个重复的关键点,则有两个选项:

  • 循环并取出每个键:

    result = alist[0].copy()
    for key in repeated:
        result[key] = [d[key] for d in alist]
    
  • 创建所有键列表,这样您就不必不断查看重复键列表:

    result = {}
    for key in alist[0]:
        result[key] = [d[key] for d in alist]
    
后一个选项也可以通过在
alist
上迭代一次来实现:

result = {}
for d in alist:
    for key, value in d.items():
        result.setdefault(key, []).append(value)

您可以使用列表:

result = [alist[0].copy()]
result[0]['c'] = [d['c'] for d in alist]
请注意,将此再次列为列表没有什么意义;毕竟,您将所有内容合并到一本词典中:

result = dict(alist[0], c=[d['c'] for d in alist])
如果有多个重复的关键点,则有两个选项:

  • 循环并取出每个键:

    result = alist[0].copy()
    for key in repeated:
        result[key] = [d[key] for d in alist]
    
  • 创建所有键列表,这样您就不必不断查看重复键列表:

    result = {}
    for key in alist[0]:
        result[key] = [d[key] for d in alist]
    
后一个选项也可以通过在
alist
上迭代一次来实现:

result = {}
for d in alist:
    for key, value in d.items():
        result.setdefault(key, []).append(value)

使用
defaultdict
速度更快)并从中生成字典-您还可以轻松地将该字典转换为列表。您可以修改i.keys()中的
j以过滤键

from  collections import defaultdict as df

d=df(list)

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

for i in alist:
    for j in i.keys():
        d[j].append(i[j])

print dict(d.items())
输出-

{'a': [1, 1, 1], 'c': [3, 35, 87], 'b': [2, 2, 2]}
如果您想从中去除重复的元素,请使用
dict comprehension
set
-

>>>{k:list(set(v)) for k,v in d.items()}
>>>{'a': [1], 'c': [35, 3, 87], 'b': [2]}

使用
defaultdict
速度更快)并从中生成字典-您还可以轻松地将该字典转换为列表。您可以修改i.keys()中的
j以过滤键

from  collections import defaultdict as df

d=df(list)

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

for i in alist:
    for j in i.keys():
        d[j].append(i[j])

print dict(d.items())
输出-

{'a': [1, 1, 1], 'c': [3, 35, 87], 'b': [2, 2, 2]}
如果您想从中去除重复的元素,请使用
dict comprehension
set
-

>>>{k:list(set(v)) for k,v in d.items()}
>>>{'a': [1], 'c': [35, 3, 87], 'b': [2]}
我们创建一个类型为list的默认dict,然后遍历这些项并将它们附加到右键中


我们创建一个默认的dict类型列表,然后对项目进行迭代,并将其附加到正确的键中。

可以得到您的结果。如果项目具有不同的值,您必须测试是否要创建列表,或者保持列表不变

repeated_key
用于存储重复的密钥并计算它们重复的次数

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

z = {}
repeated_keys = {}
for dict in alist:
    for key in dict:
        if z.has_key(key):
            if isinstance(z[key], list):
                if not dict[key] in z[key]:
                    repeated_keys[key] +=1
                    z[key].append(dict[key])
            else:
                if z[key] != dict[key]:
                    repeated_keys[key] = 1
                    z[key] = [z[key], dict[key]]

        else:
            z[key] = dict[key]

print 'dict: ',z
print 'Repeated keys: ', repeated_keys
输出:

dict:  {'a': [1, 3], 'c': [3, 35, 87], 'b': 2}
Repeated keys:  {'c'}
如果:

输出应为:

dict:  {'a': [1, 3], 'c': [3, 35, 87], 'b': 2}
Repeated keys:  {'a': 1, 'c': 2}

可以得到结果。如果项目具有不同的值,您必须测试是否要创建列表,或者保持列表不变

repeated_key
用于存储重复的密钥并计算它们重复的次数

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

z = {}
repeated_keys = {}
for dict in alist:
    for key in dict:
        if z.has_key(key):
            if isinstance(z[key], list):
                if not dict[key] in z[key]:
                    repeated_keys[key] +=1
                    z[key].append(dict[key])
            else:
                if z[key] != dict[key]:
                    repeated_keys[key] = 1
                    z[key] = [z[key], dict[key]]

        else:
            z[key] = dict[key]

print 'dict: ',z
print 'Repeated keys: ', repeated_keys
输出:

dict:  {'a': [1, 3], 'c': [3, 35, 87], 'b': 2}
Repeated keys:  {'c'}
如果:

输出应为:

dict:  {'a': [1, 3], 'c': [3, 35, 87], 'b': 2}
Repeated keys:  {'a': 1, 'c': 2}


如果您将它们全部设置为相同的类型,那么以后将更容易操作结果:
[{'a':[1],'b':[2],'c':[3,35,87]}如果这是不可接受的,也许你使用的是错误的数据类型,需要停下来考虑一下为什么你会收到这种数据。如果你把它们都变成同一种类型,那么结果会更容易操作:<代码> [{ ]:[ 1 ],'b':[ 2 ],'c':[ 3, 35, 87 ] }。如果这是不可接受的,也许你使用的是错误的数据类型,需要停下来考虑一下为什么你会收到这种数据。这就跳过了很有可能的问题:为什么数据是这样开始的?我闻到了X-Y问题。那么问题是什么呢?我问过。但是当一个>400k的用户给出一行代码响应时(当然,这是完全准确的)对于问题的Y部分,倾向于完全忘记可能存在X——因此我认为这里值得一提。@zxq9:我不认为情况有那么奇怪;使用任何具有足够特定查询的通用API,输出中的内容都可以很容易地重复。这不是通用API的错。那么,我遵从您的经验。我事实上,这些年来,我从你那里学到了很多关于CPython的怪癖(谢谢!)。可能是因为我最近使用的其他语言的影响,我对数据的形状考虑得太严格了。这就跳过了很可能导致这种情况的问题:为什么数据一开始就是这样的形状?我闻到了一个X-Y问题。@zxq9:为什么不把它作为对这个问题的一个评论发表出来呢?是的.但是当一个>400k的用户给出一行代码响应时(当然,这是完全准确的)对于问题的Y部分,倾向于完全忘记可能存在X——因此我认为这里值得一提。@zxq9:我不认为情况有那么奇怪;使用任何具有足够特定查询的通用API,输出中的内容都可以很容易地重复。这不是通用API的错。那么,我遵从您的经验。我事实上,这些年来,我从你那里学到了很多关于CPython的怪癖(谢谢!)。可能是因为我最近使用的其他语言的影响,我对数据的形状考虑得太严格了。@Laxmikant如果您需要更多解释,请发表评论。我希望这会有所帮助。听起来像是收集的一个用例。计数器:@MKesper想要的结果是
z
而不是
重复的\u键
@Laxmikant如果你需要更多的解释,请发表评论。我希望这会有帮助。听起来像是收集的一个用例。计数器:@MKesper想要的结果是
z
not
repeated\u key
。谢谢你的回复,似乎,在这种情况下我需要设置(非重复)谢谢你的回复,似乎,在这种情况下我需要设置(非重复)