2016-08-20 1 views
-6

У меня есть список что-то, как показано ниже, и хочу, чтобы преобразовать его в СыроватскийPython преобразовать список Сыроватским с множественным значением ключа

my_list = ['key1=value1', 'key2=value2', 'key3=value3-1', 'value3-2', 'value3-3', 'key4=value4', 'key5=value5', 'value5-1', 'value5-2', 'key6=value6'] 

Как преобразовать выше список Сыроватского что-то вроде ниже

my_dict = { 
    'key1': 'value1', 
    'key2': 'value2', 
    'key3': ['value3-1', 'value3-2', 'value3-3'], 
    'key4': 'value4', 
    'key5': ['value5', 'value5-1', 'value5-2'], 
    'key6': 'value6' 
} 
+4

Похоже, вы хотите, чтобы мы написали вам код. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если есть), ожидаемый вывод и вывод, который вы фактически получаете (вывод, трассировка и т. Д.). Чем больше деталей вы предоставляете, тем больше ответов вы получите. Проверьте [FAQ] (http://stackoverflow.com/tour) и [Как спросить] (http://stackoverflow.com/questions/how-to-ask). – TigerhawkT3

+0

Я пытался его решить, но продолжал получать IndexError. –

+0

Это ужасная идея смешать типы, использовать списки для всех значений. –

ответ

2

Несколько способов сделать это, это один: EDIT: мой первый раствор дал список для каждого значения, но требуется только список, когда есть больше чем одно значение для ключа.

my_list = ['key1=value1', 'key2=value2', 'key3=value3-1', 'value3-2', 'value3-3', 'key4=value4', 'key5=value5', 'value5-1', 'value5-2', 'key6=value6'] 

my_dict = {} 
current_key = None 
for item in my_list: 
    if '=' in item: 
     current_key, value = item.split('=') 
     # This puts a string as the value 
     my_dict[current_key] = value 
    else: 
     # Check if the value is already a list 
     if not isinstance(my_dict[current_key], list): 
      # If value is not a list, create one 
      my_dict[current_key] = [my_dict[current_key]] 

     my_dict[current_key].append(item) 

import pprint 
pprint.pprint(my_dict) 

Дает:

{'key1': 'value1', 
'key2': 'value2', 
'key3': ['value3-1', 'value3-2', 'value3-3'], 
'key4': 'value4', 
'key5': ['value5', 'value5-1', 'value5-2'], 
'key6': 'value6'} 

Вы могли бы пожелать, чтобы сделать его более устойчивым, проверяя, если current_key является None. Я оставлю это вам.

+0

@cdrake Спасибо. В моем сценарии работал как прелесть –

2

Вот возможное решение:

from collections import defaultdict 
import pprint 

my_list = ['key1=value1', 'key2=value2', 'key3=value3-1', 'value3-2', 
      'value3-3', 'key4=value4', 'key5=value5', 'value5-1', 'value5-2', 'key6=value6'] 

my_dict = defaultdict(list) 
current_key = None 

for item in my_list: 
    if '=' in item: 
     current_key, value = item.split('=') 

    my_dict[current_key].append(value) 

my_dict = {k: v[0] if len(v) == 1 else v for k, v in my_dict.iteritems()} 

pprint.pprint(my_dict) 

из любопытства, если вход был словарь, получение списка будет тривиальна:

from collections import defaultdict 

my_dict = { 
    'key1': 'value1', 
    'key2': 'value2', 
    'key3': ['value3-1', 'value3-2', 'value3-3'], 
    'key4': 'value4', 
    'key5': ['value5', 'value5-1', 'value5-2'], 
    'key6': 'value6' 
} 

output = ["{0}={1}".format(k, ', '.join(v) if type(v) is list else v) 
      for k, v in my_dict.iteritems()] 
print output 
+1

Хорошая попытка. Но я думаю, что вы сделали обратное :) –

+1

Ожидается «dict» из «списка» – Ejaz

+1

@RahulKP Lol, верно, я даже не прочитал вопрос, просто увидел некоторые данные, и я не знал, какой из них был вход или выход. Я решил для обоих случаев: ') – BPL

Смежные вопросы