Python 如何在groovy中最好地从键列表/值列表获取映射?
在python中,我可以执行以下操作:Python 如何在groovy中最好地从键列表/值列表获取映射?,python,dictionary,groovy,Python,Dictionary,Groovy,在python中,我可以执行以下操作: keys = [1, 2, 3] values = ['a', 'b', 'c'] d = dict(zip(keys, values)) assert d == {1: 'a', 2: 'b', 3: 'c'} 在groovy中,有没有一种很好的方法可以从键列表和值列表开始构建映射 def keys = [1, 2, 3] def values = ['a', 'b', 'c'] def pairs = [keys, values].transpos
keys = [1, 2, 3]
values = ['a', 'b', 'c']
d = dict(zip(keys, values))
assert d == {1: 'a', 2: 'b', 3: 'c'}
在groovy中,有没有一种很好的方法可以从键列表和值列表开始构建映射
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) }
defmap=[:]
每个{map都没有直接内置到groovy中的任何东西,但是有许多方法可以轻松解决它,这里有一种:
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
函数
def keys = [1, 2, 3]
def values = ['a', 'b', 'c']
[keys,values].transpose().collectEntries { it }
非常好,它看起来像是python的transpose()
等价于zip()
。现在只要有一个对列表的映射构造函数就好了。[:].putAll(pairs.collect{new MapEntry(it[0],it[1]))
就像一行代码,但比我想要的更难看。@ataylor请参阅我更新的帖子,了解使用MapEntry
[keys,values].transpose()的另一种方法。inject([:]){map,it->map非常好。现在期待1.8甚至更多。你甚至可以省去identity闭包:[keys,values].transpose().collections()
@Maxy-B是的,从1.8.5开始:-)