我有以下字符串列表:
keys = ["hostA", "hostB"]
values = ["element1", "element2", "element3", "element4", "element5"]
我想将这两个列表组合成一个字典(字符串,列表),这样每个字符串键的列表长度(差不多)均匀。
最终结果应为:
adict["hostA"] = ["element1", "element2"]
adict["hostB"] = ["element3", "element4", "element5"]
我尝试了dict(zip(keys,values))
,但在keys
结束后,这种情况就停止了。
答案 0 :(得分:3)
好吧,我写了我生命中最丑陋的列表理解:)
delim = len(keys)
dict([(key, values[index*delim:index*delim + delim]) if index < len(keys) -1 else (key, values[index*delim:]) for index, key in enumerate(keys)])
但如果对你好,你可以把它写成一个普通的循环,它会更好。
这种理解可以处理keys
列表
答案 1 :(得分:0)
这有点疯狂,但它有效......
In [100]: a = [1,2,3,4,5,6,7,8]
In [101]: b = [100,200]
In [102]: dict(zip(b,[a[n*l:n*l+l]
for l in [(lambda x,y:x+(1 if y else 0))(*divmod(len(a),len(b)))]
for n in range(len(b))]))
Out[102]: {100: [1, 2, 3, 4], 200: [5, 6, 7, 8]}
In [103]: b = [100,200,300]
In [104]: dict(zip(b,[a[n*l:n*l+l]
for l in [(lambda x,y:x+(1 if y else 0))(*divmod(len(a),len(b)))]
for n in range(len(b))]))
Out[104]: {100: [1, 2, 3], 200: [4, 5, 6], 300: [7, 8]}
In [105]:
...因为
您可以动态定义和使用匿名函数
您可以使用divmod
运算符解包*
返回的元组。
x+(1 if y else 0)
的含义是每个组中的元素数量为len(a)/len(b)
(divmod
返回的第一个项目),除非余数(返回的第二个项目)不是{ {1}},在这种情况下,您必须将数字增加一个。