为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕婉清6462132 2021-11-23 19:37:31
我的问题有点难以用语言解释,所以请耐心等待,我会尽力而为。我有一个数组 '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 没有工作,但它没有工作) t 开始工作,直到 a) 的列表 3,因此输出应该是 C1NWC2NW,因为此时两个组件都不工作。我知道我可以通过以下方式获得“时间线”数组:TimeLine = [item[0] for item in a]但是,我不确定如何获取另一个数组,因为这意味着扫描列表以检查某个组件是否正常工作。我希望我已经很好地解释了这一点,如果你想让我改写的话,请发表评论,因为我真的很难解释这一点。提前致谢,本
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我的问题有点难以用语言解释,所以请耐心等待,我会尽力而为。我有一个数组 '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 没有工作,但它没有工作) t 开始工作,直到 a) 的列表 3,因此输出应该是 C1NWC2NW,因为此时两个组件都不工作。我知道我可以通过以下方式获得“时间线”数组:


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

但是,我不确定如何获取另一个数组,因为这意味着扫描列表以检查某个组件是否正常工作。我希望我已经很好地解释了这一点,如果你想让我改写的话,请发表评论,因为我真的很难解释这一点。


提前致谢,本尝试这个:


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'),然后连接所有这些。


查看完整回答
反对 回复 2021-11-23
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您只需要在时间线中向前移动时,保持两个组件的当前状态。


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)

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


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信