python - 如何将字符串转换为字典,如果相同的键出现两次,则将其值设为列表
问题描述
s = 'o=foo t=bar t=baz f=zap'
如何将此字符串转换为dict,但如果重复相同的键,则将其作为列表?
期待:
{'o': 'foo', 't': ['bar','baz'], 'f': 'zap'}
试过:
>>> dict(token.split('=') for token in shlex.split(s))
{'o': 'foo', 't': 'baz', 'f': 'zap'}
解决方案
您可以定义一个函数并传递一个生成器:
s = 'o=foo t=bar t=baz f=zap'
q = 'o=foo t=bar t=baz t=bop f=zap'
def dict_fromitems(items):
d = dict()
for (k, v) in items:
if k in d:
d[k] = (d[k] if type(d[k])==list else [d[k]]) + [v]
else:
d[k] = v
return d
s_dict = dict_fromitems((i.split('=') for i in s.split()))
q_dict = dict_fromitems((i.split('=') for i in q.split()))
回报:
{'o': 'foo', 't': ['bar', 'baz'], 'f': 'zap'}
{'o': 'foo', 't': ['bar', 'baz', 'bop'], 'f': 'zap'}
推荐阅读
- java - 如何从 jar 文件运行 Maven Failsafe 集成测试?
- servicenow - 是否可以在 Servicenow 中配置多个选项列表?
- autodesk-forge - 针对 beta 服务器创建场景定义时出现 422 错误
- puppeteer - 如何在 Puppeteer 中拦截服务器发送的事件消息
- android - createConfigurationContext 无法在 API 级别 <26 上以编程方式更改语言
- reactjs - 调用渲染后 React setstate 在 IE11 中不起作用
- vba - 多个附件名称相同时如何自动打印发票?
- python - K-means 聚类 - 有一个额外的变量
- java - 如何在按下按钮之前激活按钮?
- flutter - Flutter WebView 中是否支持 WebGL?