如何扫描以前的列表值以添加新的复合列表值?

时间:2019-03-01 23:55:47

标签: python arrays python-3.x list

我的问题很难用言语解释,因此在我尽力而为时请多多包涵。我有一个数组“ a”,我正在尝试编写一段代码,该代码将告诉每个组件何时工作以及多个组件是否一次出现故障。您会看到一个组件出现故障,如果它表示C1NW代表“组件1不工作”,或者当一个组件正在工作时它将显示C2W代表“组件2正在工作”。正如您从列表“ a”中看到的那样,它们已经按时间顺序排序,因此在时间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数组来自各个点,因此,查看“ a的列表2”时,您会注意到C1尚未运行,但由于C2仍未运行(a的列表1显示C2无法运行,并且直到a)的列表3才开始工作,因此输出应为C1NWC2NW,因为这两个组件此时均不工作。  我知道我可以通过以下方式获取“时间轴”数组:

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

但是,我不确定如何获取另一个数组,因为这将意味着扫描列表后方以检查某个组件是否正常工作。 我希望我已经对此进行了足够详尽的解释,如果不能,请发表评论,如果您想让我改写,我真的很难解释。

预先感谢, 本

2 个答案:

答案 0 :(得分:3)

尝试一下:

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:])))))

除了将输出格式化为所需的格式(字典格式)外,它什么也不做。将字典和组件ID排序,将键(组件)和值('W''NW')连接起来,然后将所有这些都连接起来。

答案 1 :(得分:1)

在时间轴上前进时,您只需要为这两个组件保持当前状态即可。

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)

请注意,如果您的组件标识符和工作状态是单独的字段(这实际上是我在处理数据之前要做的事情),这会更简单