Я работаю над реализацией рабочего процесса с использованием 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 раз, когда я могу? Я уверен, что есть также способ сделать этот код более эффективным, любые идеи приветствуются!

0
DUDANF 16 Окт 2019 в 16:42

1 ответ

Лучший ответ

Я полагаю, вы просто ошиблись, когда дублировали ключи для каждого имени

Первый diff в groovy - как объявить карту (словарь в python)

my_dict = [:]

Подробнее о классных коллекциях вы можете найти здесь: 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)

Я использую collectEntries объекта Map

Вы можете найти другие методы для Map в документации GDK: отличная карта просто Google gdk map

Как только Groovy Map расширяет java Map, проверьте основные методы в javadoc: java Map

1
daggett 16 Окт 2019 в 17:59