我正在使用Nextflow实施工作流。 Nextflow使用groovy作为基本语言,然后每个进程可以独立使用任何编程语言。我本质上是一名Python程序员,所以我编写的代码是使用Python。并且在转换语言时遇到了一些麻烦。
data = {
"a" : "A",
"b" : "B",
"c" : {
"somename":{
"z" : "Z",
"y" : "Y",
"params" :{
"minimum": "3000",
"ignore": "60",
"maximum_A": "2500",
"maximum_B": "500"
}
},
"somename2":{
"z" : "Z",
"y" : "Y",
"params" :{
"minimum": "3000",
"ignore": "60",
"maximum_A": "2500",
"maximum_B": "500"
}
}
}
}
CNS_PARAM_LIST = []
my_dict = {}
for each in data["c"]:
for k, v in data["c"][each].get('params', {}).items():
CNS_PARAM_LIST.extend([k, str(v)])
my_dict[each] = CNS_PARAM_LIST
print(my_dict)
基本上,我有一个JSON(数据),我需要根据一些嵌套字段制作字典。上面代码的输出是:
{'somename': ['minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500', 'minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500'], 'somename2': ['minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500', 'minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500']}
简单地,用somename
和somename2
键,并用params
值。
任何可以在1/100时间内破解此问题的Groovy编码器吗?我敢肯定,还有一些方法可以使此代码更高效,欢迎任何想法!
答案 0 :(得分:1)
我猜你只是每个名字重复的键时拼错了
groovy的第一个区别是如何声明地图(python中的字典)
my_dict = [:]
有关groovy集合的更多信息,您可以在这里找到:http://docs.groovy-lang.org/next/html/documentation/working-with-collections.html
您的案例代码:
def data = [
"a" : "A",
"b" : "B",
"c" : [
"somename":[
"z" : "Z",
"y" : "Y",
"params" :[
"minimum": "3000",
"ignore": "60",
"maximum_A": "2500",
"maximum_B": "500"
]
],
"somename2":[
"z" : "Z",
"y" : "Y",
"params" :[
"minimum": "3000",
"ignore": "60",
"maximum_A": "2500",
"maximum_B": "500"
]
]
]
]
def my_dict = data.c.collectEntries{k,v-> [k,v.params] }
println my_dict
//if you want to print it as json:
println groovy.json.JsonOutput.toJson(my_dict)
我在Map对象上使用collectEntries方法
您可以在GDK文档中找到其他Map方法:groovy Map只是Google gdk map
只要Groovy Map扩展了Java Map,请检查javadoc中的主要方法:java Map