Страницы

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

вторник, 24 декабря 2019 г.

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

#python #массивы #python_2x #python_27


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


Ответы

Ответ 1



Лучше вместо массивов воспользоваться словарем - тогда перезаписывание ключей новыми значениями вы получите "из коробки": 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'

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

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