В скрипте из файла я получаю текст в виде 0=1000;4=2000;6=1500. Я разделяю его по тэгам и = и на выходе у меня получается массив:
[['0', '1000'], ['4', '2000'], ['6', '1500']]
И мне из этого массива нужно 0, 4 и 6 перенести в массив keys, а 1000, 2000 и 1500 в массив power ПО ПОРЯДКУ, причем если в массиве keys уже есть 0, 4 или 6, то заменить в массиве power текущее значение на новое, а в keys ничего не менять.
Я пытаюсь делать это так:
for k,v in enumerate(m[0]):
for kk,vv in enumerate(net):
for kkk,vvv in enumerate(v):
if int(vv[0]) == vvv:
try:
power[keys.index(vv[0])] = int(vv[1])
except:
keys.append(int(vv[0]))
power.append(int(vv[1]))
Но в вместо того, чтобы в массивах keys и power было по 3 значения, эти 3 значения повторяются 9 раз.
Вот содержимое m[0]:
[[0, 1], [1, 0], [1, 0], [1, 0], [1, 0], [0, 1], [0, 1], [0, 1], [0, 1]]
И содержимое net:
[['0', '1000'], ['4', '2000'], ['6', '1500']]
Как сделать так, чтобы в массивах keys и power было только по 3 значения из массива net?
Ответ
Лучше вместо массивов воспользоваться словарем - тогда перезаписывание ключей новыми значениями вы получите "из коробки":
import re
s = '0=1000;4=2000;6=1500'
res = dict(re.findall(r'([^;=]*)=([^;=]*)', s))
результат:
In [19]: print(res)
{'0': '1000', '4': '2000', '6': '1500'}
In [20]: print(res.keys())
dict_keys(['0', '4', '6'])
In [21]: print(res.values())
dict_values(['1000', '2000', '1500'])
парсинг повторяющихся ключей в одной строке:
In [26]: s = '0=1000;4=2000;6=1500;0=777;6=1111'
In [27]: res = dict(re.findall(r'([^;=]*)=([^;=]*)', s))
In [28]: res
Out[28]: {'0': '777', '4': '2000', '6': '1111'}
парсинг повторяющихся ключей в нескольких строках:
In [29]: s1 = '0=1000;4=2000;6=1500'
In [30]: s2 = '0=000;4=444;6=666'
если все строки можно обработать сразу:
In [31]: res = dict(re.findall(r'([^;=]*)=([^;=]*)', ';'.join([s1, s2])))
In [32]: res
Out[32]: {'0': '000', '4': '444', '6': '666'}
если строки нужно обработать последовательно:
In [38]: res = dict(re.findall(r'([^;=]*)=([^;=]*)', s1))
In [39]: res.update(dict(re.findall(r'([^;=]*)=([^;=]*)', s2)))
In [40]: res
Out[40]: {'0': '000', '4': '444', '6': '666'}
Мне нужно получать ключ словаря по его значению. Но как это сделать?
Или делать второй словарь?
Для этого можно создать "реверсированный" словарь, но учтите, что по определению у словаря ключи должны быть уникальными:
n [59]: d = dict(a=1,b=2,c=1,d=4)
n [60]: d
ut[60]: {'a': 1, 'b': 2, 'c': 1, 'd': 4}
n [61]: d_rev = {v:k for k,v in d.items()}
т.к. значение 1 встречается больше одного раза, то в реверсированном словаре - ключ 1 будет содержать только одно значение:
n [62]: d_rev
ut[62]: {1: 'c', 2: 'b', 4: 'd'}
In [64]: d_rev[1]
Out[64]: 'c'
In [65]: d_rev[2]
Out[65]: 'b'
In [66]: d_rev[4]
Out[66]: 'd'
Комментариев нет:
Отправить комментарий