Есть странное строковое представление вроде

< Сильный > " key1 : значение1 : key2 : значение2 : ключ3 : value3 ... Keyn : valuen "

Мне нужно создать дикт, и это довольно легко решить, если у вас есть запятые, однако здесь есть только двоеточия, и вам нужно разбивать строку через каждую вторую двоеточие. Код с циклом или что-то в этом роде выглядит довольно уродливо, поэтому мне интересно, не могли бы вы помочь мне с oneliner.

-1
John Makkonen 22 Окт 2018 в 18:16

2 ответа

Лучший ответ

Вы можете просто разделить двоеточия, получить итератор над токенами и zip итератор сам с собой. Это будет красиво сочетать ключи и значения:

s = 'key1:value1:key2:value2:key3:value3:keyn:valuen'
it = iter(s.split(':'))
dict(zip(it, it))
# {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'keyn': 'valuen'}
7
schwobaseggl 22 Окт 2018 в 15:22

Если вам неудобно с iter (и решениями schwobaseggls, которые я считаю превосходными), вы можете использовать сжатые списки срезов почти таким же образом:

s = 'key1:value1:key2:value2:key3:value3:keyn:valuen'
splitted = s.split(':')

# even_elements = splitted[::2]   - take every 2nd starting at 0th index
# odd_elements  = splitted[1::2]  - take every 2nd startIng at 1st index
k = {k:v for k,v in zip(splitted[::2],splitted [1::2]) }
print(k) 

Выход:

{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'keyn': 'valuen'}

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

s = 'key1:value1:key2:value2:key3:value3:keyn:valuen'
splitted = s.split(':')
d ={}

# this generates 2-slices from the list and puts them into your dict
for k,v in (splitted[i:i+2] for i in range(0,len(splitted),2)):
    d[k] = v

# or d = { k:v for k, v in (splitted[i:i+2] for i in range(0,len(splitted),2) )}
# or d = dict(splitted[i:i+2] for i in range(0,len(splitted),2) )

print(d)

Выход:

{'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'keyn': 'valuen'}
1
Patrick Artner 22 Окт 2018 в 16:03
52932660