在Python中,我能做到以下幾點:如何從groovy的關鍵列表/值列表中獲取地圖?
keys = [1, 2, 3]
values = ['a', 'b', 'c']
d = dict(zip(keys, values))
assert d == {1: 'a', 2: 'b', 3: 'c'}
有構建地圖的常規,從鍵的列表和值的列表開始的好方法?
在Python中,我能做到以下幾點:如何從groovy的關鍵列表/值列表中獲取地圖?
keys = [1, 2, 3]
values = ['a', 'b', 'c']
d = dict(zip(keys, values))
assert d == {1: 'a', 2: 'b', 3: 'c'}
有構建地圖的常規,從鍵的列表和值的列表開始的好方法?
試試這個:
def keys = [1, 2, 3]
def values = ['a', 'b', 'c']
def pairs = [keys, values].transpose()
def map = [:]
pairs.each{ k, v -> map[k] = v }
println map
或者:
def map = [:]
pairs.each{ map << (it as MapEntry) }
沒有直接到常規建造任何東西,但也有許多方法可以輕鬆地解決這個問題,這裏有一個:
def zip(keys, values) {
keys.inject([:]) { m, k -> m[k] = values[m.size()]; m }
}
def result = zip([1, 2, 3], ['a', 'b', 'c'])
assert result == [1: 'a', 2: 'b', 3: 'c']
還有Groovy 1.8中的collectEntries
函數(目前處於beta版)
def keys = [1, 2, 3]
def values = ['a', 'b', 'c']
[keys,values].transpose().collectEntries { it }
非常好。現在期待1.8更多。 – ataylor 2010-10-07 16:55:18
你甚至可以省略身份關閉:'[keys,values] .transpose()。collectEntries()' – 2013-08-21 18:59:27
@ Maxy-B是的,因爲1.8.5 :-) – 2013-08-21 19:02:32
非常好,它看起來像'transpose()'相當於python的'zip()'。現在,如果只有對於列表對的Map構造函數。 '[:]。putAll(pairs.collect {new MapEntry(it [0],it [1])})'作爲一行內容,但比我想要的更醜。 – ataylor 2010-10-07 03:53:27
@ataylor查看我更新的帖子,瞭解另一種使用'MapEntry'的方法 – NullUserException 2010-10-07 04:00:27
'[keys,values] .transpose().injection([:]){map,it - > map <<(它作爲MapEntry)}' – 2010-10-07 06:06:08