Изоляция определенных c элементов, заключенных в скобки списка- Python - PullRequest
0 голосов
/ 18 июня 2020
ini_list = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"
res = ini_list.strip('[]')
print(res)
('G 02', 'UV', '2.73')

result = res.strip('()')
print(result)
'G 02', 'UV', '2.73'

У меня есть список, состоящий из трех элементов, заключенных в квадратные скобки, я хочу извлечь каждый элемент из скобок и присвоить ему переменную: ('G 02', 'UV', '2.73'), ( 'Load 08A_UF', '11 .38 '), et c et c et c, и я хотел бы назначить переменные этому списку, чтобы результат был следующим: первый параметр, содержащийся в скобках, должен = element Второй параметр, который в некоторых случаях может быть пустым, должен = причина. Третий параметр, который всегда является числом и может быть на второй позиции, если в скобках нет причины, должен = время.

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

Element = G 05, Load 23A_UF, Load 21A_UF ... первый элемент каждой скобки в списке. Reason = Over-Speed``, второй элемент скобки, который не является числом Time = 1,63, 11,37, 11,38, третий элемент скобки, который является числом (всегда будет числом). У меня есть многочисленные списки, которые содержат эти параметры, которые я хотел бы использовать позже для построения различных графиков, и поэтому хотел бы извлечь каждый параметр из списка и связать его с указанной переменной c. Количество скобок, содержащихся в ini_list, варьируется, поэтому хотелось бы иметь al oop, который циклически повторяется.

Я пытался сделать это с помощью Prathame sh Jadhav:

ini_list = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"

res = ini_list.strip('[]')

result = res.strip('()')

result1 = result.split(',')

result1=[x.strip(" ") for x in result1]
result1=[x.strip("''") for x in result1]

element = result1[0]
print("element:",element)
reason =result1[1]
print("reason:",reason)
time=result1[2]
print("time:",time)

Однако это работает только для первой скобки и не проходит через весь список скобок, поэтому требуется al oop. Но когда я пытаюсь использовать al oop, я не могу избавиться от скобок и знаков препинания, чтобы изолировать каждую переменную.

как мне это получить, чтобы он присваивал переменные каждому параметру, как указано выше, и поэтому он печатает так :

element = G 05, Load 23A_UF, Load 21A_UF, G 02 
reason = Over-Speed, , ,UV
time = 1.63, 11.37, 11.38, 2.73

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Вот решение, которое использует регулярное выражение для извлечения всех значений между () и literal_eval + настраиваемый класс для анализа данных на объекты с желаемыми атрибутами:

from ast import literal_eval
import re


class Fault:

    def __init__(self, stats):
        element, *reason, time = literal_eval(stats)
        self.element = element
        self.reason = reason[0] if reason else ''
        self.time = time

    def __repr__(self):
        return f'{self.__class__.__name__}("({self.element!r}, {self.reason!r}, {self.time!r})")'



data = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"

matched = re.findall(r"\(.+?\)", data)
print([Fault(m) for m in matched])

f = Fault("('G 05', 'Over-Speed', '1.63')")
print(f.element)
print(f.reason)
print(f.time)

Вывод:

[Fault("('G 05', 'Over-Speed', '1.63')"), Fault("('Load 23A_UF', '', '11.37')")...]

G 05
Over-Speed
1.63

0 голосов
/ 18 июня 2020

Обязательно ли иметь список как строку, а не как список?

ini_list = [('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]

for thing in ini_list:
    if len(thing) == 3:
        element = thing[0]
        reason = thing[1]
        time = thing[2]
    else:
        element = thing[0]
        time = thing[1]
        reason = ""
    print(f"{element} {reason} {time}")

работает, если вы можете использовать ini_list в качестве списка вместо строки.

EDIT: поскольку ini_list дается как строка. Вы можете попробовать использовать регулярные выражения.

import re


ini_list = "[('G 05', 'Over-Speed', '1.63'), ('Load 23A_UF', '11.37'), ('Load 21A_UF', '11.38'), ('Load 08A_UF', '11.38'), ('Load 07A_UF', '11.38'), ('Load 12A_UF', '11.38'), ('Load 24A_UF', '11.38'), ('Load 15A_UF', '11.38'), ('Load 16A_UF', '11.38'), ('Load 04A_UF', '11.38'), ('Load 03A_UF', '11.38'), ('Load 18A_UF', '11.38'), ('Load 25A_UF', '11.38'), ('Load 27A_UF', '11.39'), ('Load 26A_UF', '11.39')]"

#extract all tuples by regular expression
result = re.findall(r'\((.*?)\)',ini_list)

target_list = []
for tup in result:
    items = tup.split(',')
    if len(items) == 3:
        target_list.append((item[0], item[1], item[2]))
    else:
        target_list.append((item[0], None, item[1]))
...