2016-03-04 40 views
1

我有一個字符串以下列表:郵編列表以形成均勻的dictornary

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

我想這兩個清單合併爲一本字典(字符串,列表)使得每個字符串鍵的列表長度(幾乎)是一致的。

最終的結果應該是:

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

我試圖dict(zip(keys,values))但這停止荏苒的keys命中結束後。

+0

'key'和'values'列表的長度是否有所不同?如果是這樣,那麼期望的輸出是什麼? – gtlambert

+0

'keys'和'values'的長度在運行時不會改變。期望的輸出在我的OP –

+0

中給出所以你會很樂意簡單地使用切片? – gtlambert

回答

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列表

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返回的第一項)不0,在這種情況下,必須增加數字一個。