python:替换二进制向量中字符串的int

2024-09-30 10:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的问题是,我不能将二进制向量列表中的任何值替换为字符串。我的列表如下所示:

[[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的字符串,但appriopate新文本取决于索引,即“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仅用于增强对我的问题的描述


Tags: 方法字符串in报警列表forif二进制
1条回答
网友
1楼 · 发布于 2024-09-30 10:30:24

您应该使用for循环来迭代每个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

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

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

如果您不想就地更新data,而是想构造一个新的2d列表,我们可以将其转换为嵌套列表理解

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']]

编辑

如果报警有不同的名称,我们可以使用报警名称列表:例如:

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'

相关问题 更多 >

    热门问题