为字典中列表值的每种组合创建一个字典 - python

我有以下字典:

my_dict = {"A":0, "B":[1,2], "C":3}

我正在尝试将其拆分为包含每个可能值的2个词典的列表。例如:

#Desired result
[{"A":0, "B":1, "C":3}, {"A":0, "B":2, "C":3}]

我能够获得每个所需字典的列表,希望以后可以遍历该列表并使用update()合并字典。这将覆盖键"B",仅创建一个字典。

这是我所做的:

dict_list = []
my_dict = {"A":0, "B":[1,2], "C":3}

for k, v in my_dict.items():
    if type(v) == list:
        for i in v:
            dict1 = {k:i}
            dict_list.append(dict1)
    if type(v) != list:
        dict2 = {k:v}
        dict_list.append(dict2)

new_dict = {}
for d in dict_list:
    new_dict.update(d)

print(new_dict)

输出:

{'A':0, 'B':2, 'C':3}

这将覆盖键'B',并根据最后一个值仅创建一个字典。

参考方案

如果您的字典只能包含一个列表,这很容易。

>>> my_dict = {"A":0, "B":[1,2], "C":3}
>>> k, lst = next((k, v) for k, v in my_dict.items() if isinstance(v, list))
>>> [{**my_dict, k:x} for x in lst]
[{'A': 0, 'B': 1, 'C': 3}, {'A': 0, 'B': 2, 'C': 3}]

如果您的字典可以有多个列表,则有点棘手。

>>> from itertools import product
>>> 
>>> my_dict = {"A":0, "B":[1,2], "C":[3, 4]}
>>> lists_kv = ([(k, x) for x in v] for k, v in my_dict.items() if isinstance(v, list))
>>> [{**my_dict, **dict(x)} for x in product(*lists_kv)]
[{'A': 0, 'B': 1, 'C': 3},
 {'A': 0, 'B': 1, 'C': 4},
 {'A': 0, 'B': 2, 'C': 3},
 {'A': 0, 'B': 2, 'C': 4}]

如何将Python字节字符串表示形式转换为字节? - python

我在文本文件中存储了许多Python字节对象,这些Python打印的内容类似于"b'\x80\x03}q\x00.'"如何将每个对象转换回字节对象?换句话说,我正在尝试找到一个执行convert("b'\x80\x03}q\x00.'") == b'\x80\x03}q…

语法中的Python字符串 - python

看到一段使用'str in str in str'语法的代码很奇怪,例如:>>> 'test' in 'testtest' in 'testtesttest' True >>> 'test' in 'testtest' in…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

无法注释掉涉及多行字符串的代码 - python

基本上,我很好奇这为什么会引发语法错误,以及如何用Python的方式来“注释掉”我未使用的代码部分,例如在调试会话期间。''' def foo(): '''does nothing''' ''' 参考方案 您可以使用三重双引号注释掉三重单引…