2017-01-24 3 views
-1

Скажем, у меня есть список держит следующие пункты:Из списка строк в словаре

["FOO x 2", "BAR x 11", "PERC"] 

Я хотел бы преобразовать этот список в словарь со следующим результатом:

{"FOO": 2, "BAR": 11, "PERC": 1} 

Любые идеи о том, как подойти к этой проблеме?

+3

Почему 'PERC' имеет значение' 1'? –

+0

@ JimFasarakis-Hilliard * Предполагается, что * будет «x 1», если рядом с ним нет множителя. – Josh

ответ

1

Вы могли бы пойти с подачи понимания к dict:

l = ["FOO x 2", "BAR x 11", "PERC"] 
d = dict((tuple(map(str.strip, i.split('x'))) if 'x' in i else (i, 1) for i in l)) 
print(d) 
{'BAR': '11', 'FOO': '2', 'PERC': 1} 

Хотя for-loop определенно бьет его в читаемости:

d = {} 
for i in l: 
    if 'x' in i: 
     k, v = map(str.strip, i.split('x')) 
     d[k] = v 
    else: 
     d[i] = 1 
0

Однострочные:

d = {x[0].strip(): int(x[1]) for x in ((elm + 'x 1').split('x') for elm in lst)} 

print(d) 

Выходной :

{'BAR': 11, 'FOO': 2, 'PERC': 1} 

В качестве альтернативы, вы можете воспользоваться новой распаковке функции с * в Python 3:

lst = ["FOO x 2", "BAR x 11", "PERC"] 

res = {} 
for x in lst: 
    name, *count = (x + 'x 1').split('x') 
    res[name.strip()] = int(count[0]) 

print(res) 

Выход: { 'BAR': 11, 'FOO': 2 'PERC': 1 }

0

Ниже фрагмент кода, может сделать то, что вы хотите сделать

lst = ["FOO x 2", "BAR x 11", "PERC"]; 
lst1 = list() 
for elem in lst: 
    splited = elem.split('x') 
    k = 0 
    for stri in splited: 
     k = k + 1 
     if k == 1: 
      v = stri 
      u = 1 
     else: 
      u = stri 
    ar = list() 
    ar.append(v) 
    ar.append(u) 
    lst1.append(ar) 
dic = dict(lst1) 
print(dic) 
0

Один больше вно в зоопарк: теперь список понимания, расщепления и if выражение:

pass1 = [x.split(' x ') for x in l] 
# [['FOO', '2'], ['BAR', '11'], ['PERC']] 
dict((t[0], int(t[1]) if len(t) > 1 else 1) for t in pass1) 
# {'PERC': 1, 'BAR': 11, 'FOO': 2} 
0

Пара вариантов выбрать из

data = ["FOO x 2", "BAR x 11", "PERC"] 

res = { key : int(value) if value else 1 
     for key, sep, value in map(lambda s: s.partition(' x '), data) } 

res = {} 
for item in data: 
    key, sep, value = item.partition(' x ') 
    res[key] = int(value) if value else 1 

res = {} 
for item in data: 
    key, *value = item.split(' x ') 
    res[key] = int(value[0]) if value else 1 

res = {} 
for item in data: 
    key, value = (item.split(' x ') + [1])[:2] 
    res[key] = int(value) 

# Output - res 
{'FOO': 2, 'BAR': 11, 'PERC': 1} 

Заметим, что это предполагает, что ваши данные всегда будут в таком формате, в противном случае, возможно, потребуется включить .strip() или другие незначительные изменения.

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