Python Понимание Dict - PullRequest
       5

Python Понимание Dict

1 голос
/ 19 апреля 2020

Такое ощущение, что это должно быть очевидно, но мне не хватает правильной формы.

Учитывая список строк вроде

fields = ["format = gatheringnutsinmay", "device = TESTX"]

Я пытаюсь написать словесное понимание, чтобы сделать словарь из полей:

items = {"format": "gatheringnutsinmay", "device": "TESTX }

Я получил в данный момент:

_kv_seperator = re.compile(r"\s*=\s*")
items = {fk: fv for f in fields for [fk, fv] in _kv_seperator.split(f)}

но я получаю ошибку :

_kv_seperator.split(f)

ValueError: too many values to unpack (expected 2)

Исправления, пожалуйста!

Ответы [ 5 ]

3 голосов
/ 19 апреля 2020

Вам не нужна секунда для l oop, один из способов увидеть понимание словаря заключается в следующем:

items = {}
for f in fields:
    for [fk, fv] in _kv_seperator.split(f):
        items[fk] = fv

print(items)

Когда вы пишете:

for [fk, fv] in _kv_seperator.split(f)

Вы скажите Python, что вы ожидаете итерацию, состоящую из 2-х кортежей, но на самом деле

_kv_seperator.split(f) 

возвращает только один кортеж, отсюда ошибка:

ValueError: too many values to unpack (expected 2)

Вы можете сделать вместо этого:

import re

fields = ["format = gatheringnutsinmay", "device = TESTX"]
_kv_seperator = re.compile(r"\s*=\s*")
items = {fk: fv for fk, fv in map(_kv_seperator.split, fields)}

print(items)

Или просто:

items = dict(map(_kv_seperator.split, fields))
print(items)

Или, если хотите, вы можете сделать:

items = {fk: fv for fk, fv in (_kv_seperator.split(f) for f in fields)}
1 голос
/ 19 апреля 2020

Если вам нужен один лайнер, это сработает:

items = {k:v for k,v in (sp.split(' = ') for sp in fields)}
1 голос
/ 19 апреля 2020

Если формат фиксированный, я предлагаю использовать .split ():

fields = ["format = gatheringnutsinmay", "device = TESTX"]
result = {}
for f in fields:
    f = f.split(" = ")
    result[f[0]] = f[1]
print(result)
0 голосов
/ 19 апреля 2020

Вы можете использовать приведенный ниже код вместо rex:

fields = ["format = gatheringnutsinmay", "device = TESTX"]
items = {f.split(" = ")[0]: f.split(" = ")[1] for f in fields}
items

Надеюсь, это помогло.

0 голосов
/ 19 апреля 2020
items = { i.split('=')[0]:i.split('=')[1] for i in fields}
...