Zip列表的大小不等(比键更多的值)以形成统一的dictornary

时间:2016-03-04 15:04:02

标签: python list dictionary

我有以下字符串列表:

keys = ["hostA", "hostB"]
values = ["element1", "element2", "element3", "element4", "element5"]

我想将这两个列表组合成一个字典(字符串,列表),这样每个字符串键的列表长度(差不多)均匀。

最终结果应为:

adict["hostA"] = ["element1", "element2"]
adict["hostB"] = ["element3", "element4", "element5"]

我尝试了dict(zip(keys,values)),但在keys结束后,这种情况就停止了。

2 个答案:

答案 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}},在这种情况下,您必须将数字增加一个。