2016-09-21 3 views
1

У меня есть файл yaml с несколькими полями, которые являются списками.Как преобразовать значения словарного списка равномерно в Python 3?

Это выглядит вроде как это:

key0: "value0" 
key1: ["value1-0", "value1-1", "value1-2"] 
key2: ["value2-0", "value2-1", "value2-2"] 
key3: "value3" 

Это естественно преобразуется в словарь Python с библиотекой PyYAML.

В конце концов, я хочу, чтобы получить строку ключей и значений разбитых вместе следующим образом:

--key0 value0 --key1 value1-0 --key1 value1-1 --key1 value1-2 ... --key3 value3

Я придумал решение, которое зависит от того, что я имею дело со списками, но что-то меня беспокоит, и я хочу спросить, есть ли более чистый, общий и элегантный способ?

UPD: после ответа @senchuk я хотел сделать себя немного более понятным.

Вопрос не о ЛЮБОМ решении. Это просто вопрос, основанный на мнениях, для людей, которые более опытны с Python, чем я. Я постоянно слышу об этом «питоническом» пути. Это то, что я ищу! Что-то с функциональным стилем хипстера. Нет никаких ограничений на преобразование данных вообще. Если лучший способ - преобразовать все скалярные значения в списки и затем преобразовать все в строку, пусть будет так. Мне действительно интересно, как это делается сегодня в современном Python.

+0

Что летали? пожалуйста, поделитесь с нами своим кодом или любыми вашими попытками –

+0

Я сделал что-то очень похожее на решение от @senchuk. Я прошу здесь о том, как выберет опытные разработчики Python. – staroselskii

ответ

0

Вы можете перебирать словарь, чтобы построить строку. если элемент является списком, вам необходимо выполнить итерацию по его элементам.

ПРИМЕЧАНИЕ: поскольку словарь является неупорядоченным, выход может отличаться.

dict={"key0": "value0", "key1": ["value1-0", "value1-1", "value1-2"], "key2": ["value2-0", "value2-1", "value2-2"], "key3": "value3"} 

s = '' 
for k,v in dict.items(): 
    print(k, v) 
    if type(v) is list: 
     for elem in v: 
      s+= '--' + k + ' ' + str(elem) + ' ' 
    else: 
     s+= '--' + k + ' ' + str(v) + ' ' 

print(s) 

>>> --key1 value1-0 --key1 value1-1 --key1 value1-2 --key0 value0 --key3 value3 --key2 value2-0 --key2 value2-1 --key2 value2-2 
+0

Это едва ли отличается от кода, который я написал. Я думал немного более «пифонов». Эта вещь '' 'type''' прослушивала меня. Следовательно, вопрос на самом деле. – staroselskii

+0

Я отмечу это как ответ, поскольку, к сожалению, я не понял лучшего подхода. – staroselskii

0

Если у вас уже есть что-то, что превращает то, что вы попали в словарь, то это должно делать то, что вы хотите

d = {'key1' : 'value1', 'key2' : 'value2'} 
stringFinal = '' 
tempString = '' 
for k, v in d.items(): 
    tempString = str(k) + ' ' + str(v) 
    stringFinal ='--' + tempString + ' ' + stringFinal 
    tempString = '' 
print(stringFinal) 
+0

Извините, но это даже не работает! Взгляните на ответ @chenchuk. Хотя его/ее ответ не совсем то, что я ищу, он работает. – staroselskii

+0

Прошу прощения !! я не понял, что у вас есть списки в качестве значений в вашем словаре, я думал, что вы имеете дело только со строковыми значениями. Да, chenchuks решение работает, и не могли бы вы быть более конкретными, как то, что вы подразумеваете под pythonic? Как в более эффективном? Я ценю ваш ответ! – BLang

+0

Ни о чем не жалеть! Я думал о понимании списков, itertools и так далее. Обычно я не пытаюсь чрезмерно усложнять ситуацию. Но в тот момент, когда я набираю '' ', если type (v) является list''', я думаю, что все в порядке, есть еще одно более четкое решение. Обычно я нахожу его сам, но на этот раз я пробовал в течение часа безрезультатно. Все решения, которые я придумал, облегчили тот факт, что я имею дело со списками. – staroselskii