Skip to main content
 首页 » 编程设计

python之当单个键有多个值时拆分 Python 字典

2025年05月04日12hnrainll

我有一些 Python 字典,对于一个键,有时会有多个值,用逗号分隔(例如“value1, value2”)。在这些情况下,我需要将字典分成许多多个值(有关所需输出的示例,请参见问题底部)。字典中每个键只能有一个值,否则它需要是一个完全独立的字典。

我试图遍历字典并在找到具有多个值的值时使用 popitem 函数。然后创建单独的字典并附加它们。但是我遇到了运行时错误。而且我怀疑可能有更优雅的解决方案。

例如

x = {"name":"alice", "age":20,"hobby":"badminton, basketball", "language":"python"} 
for eachkey, value in x.items(): 
    if ", " in value: 
        x.popitem() 

在继续之前得到以下错误:

RuntimeError: dictionary changed size during iteration 

这是预期输入和输出的示例:

输入

x = {"name":"alice", "age":20,"hobby":"badminton, basketball", "language":"python"} 

输出

[ 
    {"name":"alice", "age":20,"hobby":"badminton", "language":"python"}, 
    {"name":"alice", "age":20,"hobby":"basketball", "language":"python"} 
] 

或者另一个例子,多个键和多个值:
(在@isaactfa 回答后编辑+包括澄清)

输入

x = {"name":"alice", "age":20,"hobby":"badminton, basketball", "language":"python, go"} 

输出

[ 
    {'name': 'alice', 'age': 20, 'hobby': 'badminton', 'language': 'python'},  
    {'name': 'alice', 'age': 20, 'hobby': 'badminton', 'language': 'go'},  
    {'name': 'alice', 'age': 20, 'hobby': 'basketball', 'language': 'python'},  
    {'name': 'alice', 'age': 20, 'hobby': 'basketball', 'language': 'go'} 
] 

请您参考如下方法:

我首先将输入转换为键值元组列表的列表(好吧)

def unwrap(d): 
    for k, v in d.items(): 
        if isinstance(v, str): 
            yield [(k, v2.strip()) for v2 in v.split(',')] 
        else: 
            yield [(k, v)] 

这样用

d = { 
    "name": "alice", 
    "age": 20, 
    "hobby": "badminton, basketball", 
    "language": "python, go" 
} 

它会返回

[ 
    [('name', 'alice')],  
    [('age', 20)],  
    [('hobby', 'badminton'), ('hobby', 'basketball')],  
    [('language', 'python'), ('language', 'go')] 
] 

完成后,应用 itertools.product 将其转换为所有可能的字典列表:

result = [ 
    dict(x) 
    for x in product(*unwrap(d)) 
] 

结果为

[ 
    {'name': 'alice', 'age': 20, 'hobby': 'badminton', 'language': 'python'},  
    {'name': 'alice', 'age': 20, 'hobby': 'badminton', 'language': 'go'},  
    {'name': 'alice', 'age': 20, 'hobby': 'basketball', 'language': 'python'},  
    {'name': 'alice', 'age': 20, 'hobby': 'basketball', 'language': 'go'} 
]