我有一些 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'}
]
