我有两个相同数量的索引列表。
eg:
hst = ['host1', 'host2', 'host1', 'host2']
err = ['Tomcat', 'Disk Space', 'MySQL', 'Apache']
我想将其转换为以下格式的字典:
{'host1': ['Tomcat', 'MySQL'],
'host2' : ['Disk Space', 'Apache'],
}
发布于 2015-09-25 18:01:09
我会使用zip()
函数和dict.setdefault()
。示例:
dic = {}
for x,y in zip(hst,err):
dic.setdefault(x,[]).append(y)
演示-
>>> hst = ['host1', 'host2', 'host1', 'host2']
>>> err = ['Tomcat', 'Disk Space', 'MySQL', 'Apache']
>>> dic = {}
>>> for x,y in zip(hst,err):
... dic.setdefault(x,[]).append(y)
...
>>> dic
{'host2': ['Disk Space', 'Apache'], 'host1': ['Tomcat', 'MySQL']}
zip()
函数在相应的索引处组合两个列表(直到最小数组的索引,但这对您来说不是问题,因为您说我有两个索引数量相等的列表。),所以对于第一次迭代,你会得到x作为'host1'
,y作为'Tomcat'
,对于第二次迭代,你会得到x作为'host2'
,y作为'Disk Space'
,依此类推。
dict.setdefault(key, default)
使用默认值设置键,如果键不存在于字典中,则返回默认值,如果键存在于字典中,则返回其值。
发布于 2015-09-25 18:31:28
collections.defaultdict是对处理重复键的数据进行分组的最有效方式:
from collections import defaultdict
d = defaultdict(list)
hst = ['host1', 'host2', 'host1', 'host2']
err = ['Tomcat', 'Disk Space', 'MySQL', 'Apache']
for k,v in zip(hst,err):
d[k].append(v)
输出:
defaultdict(<type 'list'>, {'host2': ['Disk Space', 'Apache'],
'host1': ['Tomcat', 'MySQL']})
发布于 2015-09-25 18:36:12
简单的EAFP方法:
hst = ['host1', 'host2', 'host1', 'host2']
err = ['Tomcat', 'Disk Space', 'MySQL', 'Apache']
def make_dict(hst, err):
d = {}
for h, e in zip(hst, err):
try:
d[h].append(e)
except KeyError:
d[h] = [e]
return d
expected = {'host1': ['Tomcat', 'MySQL'], 'host2' : ['Disk Space', 'Apache']}
result = make_dict(hst, err)
assert expected == result
https://stackoverflow.com/questions/32779642
复制相似问题