Страницы

Поиск по вопросам

понедельник, 26 ноября 2018 г.

Почему слишком много значений?

В скрипте из файла я получаю текст в виде 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'

Комментариев нет:

Отправить комментарий