【问题标题】:Python to output value based from input text which is added into arraysPython 根据添加到数组中的输入文本输出值
【发布时间】:2021-10-05 12:33:38
【问题描述】:

我是 Python 编码的初学者,但我希望从几个因素中找到一个输出。我会尽力解释的。

有6个区域ZONE = ["RED", "GREEN", "BLUE", "YELLOW", "PINK", "WHITE"]

为了争论,目前有两个设备,但还会有更多,这些设备分别称为 PIRSMOKE

当一个新设备上线时,我是 python 为它分配一个新的 ZONE 颜色,但如果 ZONE 已经包含相同类型的设备,它应该选择另一个 ZONE,除非如果所有 ZONE 都已经有相同的设备,那么它可以开始加倍等等。

当每个设备上线时,我会收集设备的详细信息,例如 MAC 地址和设备类型……数组的索引是一个设备

MAC = ["ABC","DEF","GHI"]
TYPE = ["PIR","PIR","SMOKE"]
ZONE = ["RED","GREEN","RED"]

当 4 号设备上线时,我希望 python 告诉我下一个可用的 ZONE 颜色是什么。由于我已经在 ZONE RED 和 GREEN 中获得了两个 PIR,我希望 PIR 设备的下一个结果是 BLUE,而下一个 SMOKE 设备是 GREEN。然后 Python 会将 ZONE 颜色发送到新设备,以便设备可以设置其区域颜色模式(前面的通信已经开始工作)。

我已经部分能够让一个测试项目工作,但它只是告诉我下一个可用的颜色,但没有考虑设备类型。我的例子如下:

ZONE = ["RED", "GREEN", "BLUE", "YELLOW", "PINK", "WHITE"]
ZONEDevices  = [0,0,0,0,0,0]
DEVICES = ["PIR", "PIR", "SMOKE"]
MAC = ["123", "456", "789"]
DEVICEZONE = ["RED", "GREEN", "RED"]

# Following counts how many devices are in each zone and adds to the array
ZONEDevices[0] = DEVICEZONE.count("RED")
ZONEDevices[1] = DEVICEZONE.count("GREEN")
ZONEDevices[2] = DEVICEZONE.count("BLUE")
ZONEDevices[3] = DEVICEZONE.count("YELLOW")
ZONEDevices[4] = DEVICEZONE.count("PURPLE")
ZONEDevices[5] = DEVICEZONE.count("WHITE")

IN = "PIR-ABC" # This is what goes into the python script
OUT = IN.split("-") # Splits the input into an array
print(OUT) # OUTPUT: ['PIR', '123']

ID = ZONEDevices.index( min(ZONEDevices) ) # OUTPUT HERE IS 2, ZONE-BLUE
if (ID == 0): print("ZONE-RED")
if (ID == 1): print("ZONE-GREEN")
if (ID == 2): print("ZONE-BLUE")
if (ID == 3): print("ZONE-YELLOW")
if (ID == 4): print("ZONE-PURPLE")
if (ID == 5): print("ZONE-WHITE")

DEVICES.append(OUT[0]) # adds the input device type to the devices array
MAC.append(OUT[1]) # adds the input device MAC to the MAC array
print(DEVICES,MAC) # OUTPUT: ['PIR', 'PIR', 'SMOKE', 'PIR'] ['123', '456', '789', 'ABC']

#but what I am wanting to achieve is to get the script to give me the next
#available zone to use if a device is not already active in that zone

#DEVICEZONE.append( UNKNOWN )

我希望这是有道理的。我不太确定从哪里开始。任何帮助将不胜感激。

【问题讨论】:

  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。您所问的内容适合教程网站或一般帮助论坛。
  • I’m stuck,没有具体细节,也没有你的适用研究,是问题分析或规范导师的问题。对于 Stack Overflow,它不够专注。请注意,您确实知道接下来要采取哪些合乎逻辑的步骤。您需要弄清楚您(人类)将如何在纸上执行此操作,然后将您的数据表示和处理步骤转换为 Python。
  • 很抱歉造成混淆,我已经用一个简单的示例更新了我的代码(我试图不让它过于复杂)。希望这能更好地解释事情......@Prune
  • 在构建问题标题时,请尝试针对您在常见问题解答中的问题中看到的内容。 “请帮助”不符合格式——目标是在尽可能小的空间内提供尽可能多的信息,以帮助人们确定他们是否有信息来回答问题,或者他们是否有同样的问题并且愿意从它的答案中受益。
  • 您能否重新关注这一点,少关注您要解决的更大问题,而多关注阻碍您自己解决问题的具体技术问题?

标签: python arrays arraylist


【解决方案1】:

你所说的问题很简单,这让我觉得我错过了一些东西。此代码将告诉您此设备类型的下一种颜色。谨慎的编码员可能会添加% len(ZONE) 以避免溢出:

ZONE = ["RED", "GREEN", "BLUE", "YELLOW", "PINK", "WHITE"]
DEVICES = ["PIR", "PIR", "SMOKE"]
MAC = ["123", "456", "789"]
DEVICEZONE = ["RED", "GREEN", "RED"]

def findNextColor( device ):
    k = DEVICES.count(device) % len(ZONE)
    return ZONE[k]

print( "Next PIR is", findNextColor('PIR') )
print( "Next SMOKE is", findNextColor('SMOKE') )

输出:

Next PIR is BLUE
Next SMOKE is GREEN

跟进

好的,所以规范不是“按顺序分配颜色”。它是“分配迄今为止点击次数最少的颜色,如果有平局,则使用列表顺序。”请注意,我构建了一个数据库来计算每个设备的出现次数。我可能会将所有这些都放在一个类中,这样每次添加内容时都会更新数据库。

像这样:

ZONE = ["RED", "GREEN", "BLUE", "YELLOW", "PINK", "WHITE"]
DEVICES = ["PIR", "PIR", "PIR", "PIR","PIR","SMOKE"]
MAC = ["123", "456", "789"]
DEVICEZONE = ["RED", "GREEN", "BLUE", "YELLOW", "PINK","GREEN"]

def distribute( devs, devzones ):
    z1 = { z:0 for z in ZONE }
    tracker = {}
    for d,z in zip(devs,devzones):
        if d not in tracker:
            tracker[d] = z1.copy()
        tracker[d][z] += 1
    return tracker

DB = distribute( DEVICES, DEVICEZONE )
print(DB)

def findNextColor( device ):
    low = min( DB[device].values() )
    return [k for k,v in DB[device].items() if v == low][0]

print( "Next PIR is", findNextColor('PIR') )
print( "Next SMOKE is", findNextColor('SMOKE') )

输出:

Next PIR is WHITE
Next SMOKE is RED

【讨论】:

  • 谢谢蒂姆的回答。这部分可行,但是当数组变得更满并且所有区域颜色都已使用时,它需要返回下一个最少使用的颜色:在下面的示例中,id 期望下一个 SMOKE 颜色为 RED,因为它还没有用过的。当我将另一个模块添加到该 DEVICES 数组中时,代码会崩溃,但它需要继续运行。如果我将另一个 PIR 添加到该数组中,则它需要返回 WHITE 作为下一个可用颜色,如果添加了另一个 PIR,则返回 RED。希望这是有道理的:)
  • 区域 = [“红色”、“绿色”、“蓝色”、“黄色”、“粉色”、“白色”] 设备 = [“PIR”、“PIR”、“PIR”、 "PIR","PIR","SMOKE"] MAC = ["123", "456", "789"] DEVICEZONE = ["RED", "GREEN", "BLUE", "YELLOW", "PINK", "GREEN"] def findNextColor(device): k = DEVICES.count(device) return ZONE[k] print("Next PIR is", findNextColor('PIR')) print("Next SMOKE is", findNextColor('SMOKE ') )
  • 为什么第一个“SMOKE”分配给“GREEN”?这不符合你的模式。第一个设备需要是红色的。正如我在原始答案中暗示的那样,我在上面添加了“%”,它可以在设备有 6 个条目后环绕。
  • 再次感谢蒂姆,是的,这似乎部分有效。我不能说我以前在这样的代码中使用过 % ,所以不太确定它是如何工作的(将对其进行更多研究)。烟雾是绿色的原因是因为有了模块,我实际上可以在更新阵列的设备上手动设置区域,然后测试如果第一个设备 [SMOKE] 类型为绿色会发生什么。在某些情况下,一个区域中可能有超过 1 个 PIR 以 RED RED RED 开始,因此自动分配会将其分配给 GREEN 是下一个,而不是仅仅认为它会是 YELLOW 下一个
  • 非常感谢,这正是我想要的! :)
猜你喜欢
  • 2012-12-15
  • 2014-03-30
  • 2021-08-01
  • 2017-02-06
  • 1970-01-01
  • 2013-05-17
  • 2010-12-08
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多