如何根据值的相似性将字典拆分为两个单独的字典

时间:2021-07-31 20:11:04

标签: python dictionary

我有一个dict

dictionary =  {'1': 'a',
     '2': 'a',
     '3': 'b',
     '4': 'b'}

我想拆分它,这样一个 dict 包含所有带有 value == 'a' 的项目,另一个包含所有带有 value == 'b' 的项目:

dict_a = {'1': 'a',
     '2': 'a'}

dict_b = {'3': 'b',
     '4': 'b'}

我怎样才能在短时间内做到这一点? 我的方法

dict_a = {}
dict_b = {}
for key, value in dictionary.items():
     if value == 'a':
         dict_a = dict(key, value)
     else:
         dict_b = dict(key, value)

不起作用。

3 个答案:

答案 0 :(得分:4)

试试这个:

dict_a={}
dict_b={}
for key, value in dictionary.items():
    if value == 'a':
        dict_a[key] = value
    else:
        dict_b[key] = value

在您的原始代码中,您每次遍历循环时都在重新创建 dict_adict_b

如果您不确定您的起始 dict 仅包含 "a""b" 值,请改用:

dict_a={}
dict_b={}
for key, value in dictionary.items():
    if value == 'a':
        dict_a[key] = value
    elif value == 'b':
        dict_b[key] = value
    else:
        pass

答案 1 :(得分:2)

如果您想要更短的解决方案,您也可以使用 filter()

dict_a = dict(filter(lambda kv: kv[1] == 'a', dictionary.items()))
dict_b = dict(filter(lambda kv: kv[1] == 'b', dictionary.items()))

请注意,如果您必须多次执行此操作,这可能比手动 for 循环慢。

无论如何,如果您已经知道 dict_a 中的每个值都将是 "a"dict_b 中的每个值都将是 "b"似乎浪费空间,您根本不需要字典:

keys_a = []
keys_b = []

for key, value in dictionary.items():
    if key == 'a':
        keys_a.append(key)
    else:
        keys_b.append(key)

或使用filter()

keys_a = list(filter(lambda k: dictionary[k] == 'a', dictionary.keys()))
keys_b = list(filter(lambda k: dictionary[k] == 'b', dictionary.keys()))

答案 2 :(得分:0)

如果初始 dict 中的值不受您控制,或者不限于 ab,您可以尝试以下操作:

def combine_similar_values(input_dict):
    output = {}
    distinct_values = set()
    for k, v in input_dict.items():
        v_str = str(v)
        if v_str in distinct_values:
            output[v_str][k] = v
        else:
            distinct_values.add(v_str)
            output[v_str] = {k: v}
    return output.values()

combine_similar_values 将返回一个字典列表,其中每个 dict 包含相同的值。

相关问题