Python:取代二进制向量的字符串的INT



所以我的问题是我无法将二进制向量列表替换为字符串。我的清单看起来像:

[[0 0 0 1 0 0 1 0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 1 0 1 0 1 0 0 0 0]
 [0 1 0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 1 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]]

我想从这些向量中替换那些,但根据这些向量的索引。我尝试了这样的事情:

for row in list:
    if(row[0] == 1):
        row[0] == 'Alarm0'
    else:
        row[0] == ' '
    if(row[1] == 1):
        row[1] == 'Alarm1'
    else:
        row[1] == ' '

以及列表中每一行的相同方法。我知道这不是这样做的有效方法,但是它甚至不起作用。它给我错误:

ValueError: invalid literal for int() with base 10: ''

因此,我想删除所有0个值并替换有1个位置的字符串,但是学会的新文本取决于索引,其中" 1"出现。我的输出应该是:

[[Alarm3, Alarm6, Alarm11] -> because I have ones on indexes 3,6,11 in my input list
 [Alarm6, Alarm8, Alarm10]
           .
           . same concept for all rows
           .
 [Alarm14]]

我将感谢任何建议。

编辑:每个警报都应该是一个唯一的字符串,带有索引的警报只是我的示例。实际上,我有"连接丢失"之类的警报。alarm0,alarm1,alarm2仅在这里增加我的问题描述。

您应该使用 for loop 在每个row上迭代。然后,您可以使用另一个在行上迭代的嵌套 for循环。每次找到一个时,都应将相应的警报添加到另一个列表中。在嵌套for循环的末尾,我们用构造的旧列表替换旧列表,例如:

for ri,row in enumerate(data):
    under_construction = []
    for idx,elm in enumerate(row):
        if elm:
            under_construction.append('Alarm{0}'.format(idx))
    data[ri] = under_construction

以上不是很优雅:我们可以使用 list classension 来构建一个新列表,并使用切片分配优雅地替换了整个行:

for row in data:
    row[:] = ['Alarm{0}'.format(idx) for idx,elm in enumerate(row) if elm]

如果您不想更新data Inplote,但要构建一个新的2D列表,我们可以将其变成 nested List consension

result = [['Alarm{0}'.format(idx) for idx,elm in enumerate(row) if elm] for row in data]

例如(基于您的示例数据):

>>> data = [[0,0,0,1,0,0,1,0,0,0,0,1,0,0,0],
... [0,0,0,0,0,0,1,0,1,0,1,0,0,0,0],
... [0,1,0,0,1,0,0,0,0,0,0,0,0,0,0],
... [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0],
... [0,0,0,0,0,0,0,0,1,0,0,0,1,0,0],
... [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]]
>>> 
>>> [['Alarm{0}'.format(idx) for idx,elm in enumerate(row) if elm] for row in data]
[['Alarm3', 'Alarm6', 'Alarm11'], ['Alarm6', 'Alarm8', 'Alarm10'], ['Alarm1', 'Alarm4'], ['Alarm8'], ['Alarm8', 'Alarm12'], ['Alarm14']]

编辑

如果警报有不同的名称,我们可以使用警报名称的:e.g。:

alarm_names = ['CONNECTION LOST', 'INTRUDER ALARM', 'Alarm 2', 'Alarm3', ...]

然后,我们可以将原位代码重写为zip

for row in data:
    row[:] = [name for elm,name in zip(row,alarm_names) if elm]

或生成新列表:

result = [[name for elm,name in zip(row,alarm_names) if elm] for row in data]

使用alarm_names

>>> alarm_names
['CONNECTION LOST', 'INTRUDER ALARM', 'Alarm 2', 'Alarm 3', 'Alarm 4', 'Alarm 5', 'Alarm 6', 'Alarm 7', 'Alarm 8', 'Alarm 9', 'Alarm 10', 'Alarm 11', 'Alarm 12', 'Alarm 13', 'Alarm 14', 'Alarm 15', 'Alarm 16', 'Alarm 17', 'Alarm 18', 'Alarm 19', 'Alarm 20', 'Alarm 21', 'Alarm 22', 'Alarm 23', 'Alarm 24', 'Alarm 25', 'Alarm 26', 'Alarm 27', 'Alarm 28', 'Alarm 29', 'Alarm 30', 'Alarm 31', 'Alarm 32', 'Alarm 33', 'Alarm 34', 'Alarm 35', 'Alarm 36']

我们得到:

>>> [[name for elm,name in zip(row,alarm_names) if elm] for row in data]
[['Alarm 3', 'Alarm 6', 'Alarm 11'], ['Alarm 6', 'Alarm 8', 'Alarm 10'], ['INTRUDER ALARM', 'Alarm 4'], ['Alarm 8'], ['Alarm 8', 'Alarm 12'], ['Alarm 14']]

注意'INTRUDER ALARM'

最新更新