Python: сопоставить элементы из списка - PullRequest
2 голосов
/ 11 апреля 2019

После разбора файла CSV, я получаю этот список из одной из строк:

['', 'value1', '346.897', '', 'value2', '202.306', 'value3', '136.880', 'value4', '7.711', '']

В результате мне нужно получить:

{
    'value1': 346.897,
    'value2': 202.306,
    ...
}

Кто-нибудь знаеткак сделать это красиво?не используя индексы.

Теперь я удаляю всю пустую строку из списка, а затем беру элемент [0], например key и [1], например value и т. д.

Variables :value1 # ... - are dynamic

Ответы [ 5 ]

5 голосов
/ 11 апреля 2019
s = ['', 'value1', '346.897', '', 'value2', '202.306', 'value3', '136.880', 'value4', '7.711', '']
s = list(filter(None, s))        # fastest way to remove the empty strs        
zipped = zip(s[0::2], s[1::2])   # zip them   

print({k:v for k,v in dict(zipped).items()})

OUTPUT

{'value1': '346.897', 'value2': '202.306', 'value3': '136.880', 'value4': '7.711'}

Shorter-версия

s = list(filter(None, s))
print(dict(zip(s[0::2], s[1::2])))

OUTPUT

{'value1': '346.897', 'value2': '202.306', 'value3': '136.880', 'value4': '7.711'}

pyFiddle

2 голосов
/ 11 апреля 2019

Один из способов сделать это - сначала избавиться от пустых строк, а затем преобразовать их в словарь, зная, что вам нужно сделать шаг 2 по индексу, чтобы перейти от одной пары (ключ, значение) кследующее:

L = ['', 'value1', '346.897', '', 'value2', '202.306', 'value3', '136.880', 'value4', '7.711', '']
L = [elt for elt in L if elt != '']
D = {L[k]:L[k+1] for k in range(0, len(L), 2)}

Вывод:

Out[8]: 
{'value1': '346.897',
 'value2': '202.306',
 'value3': '136.880',
 'value4': '7.711'}
2 голосов
/ 11 апреля 2019

Вы можете удалить пустые элементы из списка, разделить элементы на куски по 2, а затем использовать понимание вхождения.

Пример:

data = ['', 'value1', '346.897', '', 'value2', '202.306', 'value3', '136.880', 'value4', '7.711', '']

data = [i for i in data if i]   #Clean data
data = [data[i:i+2] for i in range(0, len(data), 2)]   #Divide list elements to chunks of 2
result = {k: v for k, v in data}    #dict comprehension 
print(result)

Выход:

{'value1': '346.897',
 'value2': '202.306',
 'value3': '136.880',
 'value4': '7.711'}
1 голос
/ 11 апреля 2019

Если вы уверены в соседней паре key, value в списке.Вы можете просто сделать iterator из этого list и сделать из него dict, как,

>>> data
['', 'value1', '346.897', '', 'value2', '202.306', 'value3', '136.880', 'value4', '7.711', '']
>>> data_ = [x for x in data if x] # clean the data
>>> d = iter(data_) # make an iterator
>>> {x: next(d) for x in d}
{'value4': '7.711', 'value3': '136.880', 'value2': '202.306', 'value1': '346.897'}
1 голос
/ 11 апреля 2019

Вы можете попробовать что-то вроде этого:

input_list = ['', 'value1', '346.897', '', 'value2', '202.306', 'value3', '136.880', 'value4', '7.711', '']

# Filtering for empty strings
res = [item for item in input_list if item != ""]

# Making pairs of list items
pairs = zip(res[::2], res[1::2])


res_dict = dict(pairs)

print (res_dict)

Вывод:

{'value1': '346.897', 'value2': '202.306', 'value3': '136.880', 'value4': '7.711'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...