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

时间:2017-09-01 13:25:23

标签: python string list replace

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

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

我会很感激任何建议。

编辑: 每个警报应该是一个唯一的字符串,带索引的警报只是我的例子。实际上,我有像#34; CONNECTIONS LOST"这样的警报。 Alarm0,Alarm1,Alarm2仅用于提升我的问题描述。

1 个答案:

答案 0 :(得分:0)

您应该使用 row循环迭代每个for。然后,您可以使用迭代该行的另一个嵌套 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 comprehension 构建一个新列表,并使用 slice assignment 来优雅地替换整行:

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

如果您不想更新data inplace,但想要构建一个新的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'