Как сканировать предыдущие значения списка, чтобы добавить новое значение составного списка? - PullRequest
0 голосов
/ 02 марта 2019

Мою проблему немного сложно объяснить словами, поэтому, пожалуйста, потерпите меня, пока я стараюсь изо всех сил.У меня есть массив «а», и я пытаюсь написать кусок кода, который скажет, когда каждый компонент работает и если несколько компонентов вышли из строя одновременно.Вы можете увидеть, когда произошел сбой компонента, если он говорит C1NW, поскольку это означает «Компонент 1 не работает», или когда компонент работает, он скажет C2W, что означает «Работа компонента 2».Как видно из списка «а», они уже отсортированы по временному порядку, поэтому в момент времени 1067 компонент 2. не работает.

a = [ [1067.8420440505633, 'C2NW'], [1287.3506292298346, 'C1NW'], [1363.9930359848377, 'C2W'], [1483.1371597306722, 'C1W'], [1767.6648314715849, 'C2NW']

В идеале, я хотел бы получить массив «Временная линия» с'Компонент работает или нет' массив для сравнения.По сути, я хотел бы получить массив, который выглядит следующим образом:

TimeLine = [1067.8420440505633, 1287.3506292298346, 1363.9930359848377, 1483.1371597306722, 1767.6648314715849]
WorkingOrNot = [ C2NW, C1NWC2NW, C1NWC2W, C1WC2W, C1WC2NW]

Массив WorkingOrNot поступает из каждой точки, поэтому, посмотрев «список 2 из», вы заметите, что C1 не работает, а C2 все ещееще не работает (Список 1 показывает, что C2 не работает, и он не начинает работать, пока список 3 из), поэтому вывод должен быть C1NWC2NW, так как оба компонента не работают в настоящее время.Я знаю, что могу получить массив «Time Line» с помощью:

TimeLine = [item[0] for item in a]

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

Заранее спасибо, Бен

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Вам нужно только поддерживать текущее состояние для обоих компонентов по мере продвижения вперед по временной шкале.

from functools import reduce

timeLine     = []
workingOrNot = []

states     = [ (item[0],item[1][:2],item[1][2:]) for item in a ]
combined = dict()
for time,component,state in states:
    combined[component] = state
    timeLine.append(time)
    components = "".join(sorted("".join(s) for s in combined.items()))
    workingOrNot.append(components)

обратите внимание, что это было бы проще, если бы ваши идентификаторы компонентов и рабочие состояния были отдельными полями(что, по сути, и нужно было сделать перед обработкой данных)

0 голосов
/ 02 марта 2019

Попробуйте это:

import re

a = [ [1067.8420440505633, 'C2NW'], [1287.3506292298346, 'C1NW'], [1363.9930359848377, 'C2W'], [1483.1371597306722, 'C1W'], [1767.6648314715849, 'C2NW'] ]

Timeline, statuses = zip(*a)

WorkingOrNot = []
current_statuses = {}

# Regex pattern to extract component and working/not working status
pattern = re.compile(r'(C\d+)(\w+)')

for status in statuses:
    match = pattern.search(status)
    # Set the key corresponding to component to the status (W or NW)
    current_statuses[match[1]] = match[2]
    WorkingOrNot.append(''.join(map(''.join, sorted(current_statuses.items(), key=lambda kv: int(kv[0][1:])))))

print(WorkingOrNot)
# ['C2NW', 'C1NWC2NW', 'C1NWC2W', 'C1WC2W', 'C1WC2NW']

Код достаточно понятен.Единственные запутанные части могут быть

Timeline, statuses = zip(*a)

, что эквивалентно

TimeLine = [item[0] for item in a]
statuses = [item[1] for item in a]

И эта строка:

WorkingOrNot.append(''.join(map(''.join, sorted(current_statuses.items(), key=lambda kv: int(kv[0][1:])))))

Это не что иное, как форматирование вывода вжелаемый формат формы его словарная форма.Сортируя в словаре мой идентификатор компонента, соедините ключ (компонент) и значение ('W' или 'NW'), а затем соедините все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...