Найти строку в массиве строк, где некоторый элемент не равен нулю - PullRequest
0 голосов
/ 23 января 2019

У меня есть массив строк.Как найти элементы, не равные нулю, и напечатать эти строки?Как я могу сделать это правильно?

Вот что я хочу увидеть:

Port        Align-Err     FCS-Err    Xmit-Err     Rcv-Err  UnderSize  OutDiscards "
Gi0/16              0         116           0         116          0           56
Gi0/3               0           0           23          0          0       315887
Po1                 0      232464           0      232464          0     21331230

Мой массив:

array = [
        "Port        Align-Err     FCS-Err    Xmit-Err     Rcv-Err  UnderSize  OutDiscards ", 
        "Gi0/1               0           0           0           0          0       212086 ", 
        "Gi0/2               0           0           0           0          0       184832 ", 
        "Gi0/3               0           0           23          0          0       315887 ", 
        "Gi0/4               0           0           0           0          0       253439 ", 
        "Gi0/5               0           0           0           0          0       135034 ", 
        "Gi0/6               0           0           0           0          0       132617 ", 
        "Gi0/7               0           0           0           0          0         5816 ", 
        "Gi0/8               0           0           0           0          0        12266 ", 
        "Gi0/9               0           0           0           0          0       573217 ", 
        "Gi0/10              0           0           0           0          0       844880 ", 
        "Gi0/11              0           0           0           0          0       264766 ", 
        "Gi0/12              0           0           0           0          0       197496 ", 
        "Gi0/13              0           0           0           0          0            0 ", 
        "Gi0/14              0           0           0           0          0       372725 ", 
        "Gi0/15              0           0           0           0          0     14260434 ", 
        "Gi0/16              0         116           0         116          0           56 ", 
        "Gi0/17              0           0           0           0          0      6905901 ", 
        "Gi0/18              0           0           0           0          0       333387 ", 
        "Po1                 0      232464           0      232464          0     21331230 ", 
]

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Ниже приведены два метода, которые я могу предложить:

1. Простой цикл, здесь я проигнорировал первый и последний элемент: (я думаю, это то, что вам нужно)

for i in array:
    if any(x!="0" for x in i.split()[1:-1]): # here 1:-1 are the range where we are checking the values, you can edit it as per your need
        print (i)

2. То же, используя понимание списка

print ([i for i in array if any(x!="0" for x in i.split()[1:-1])])

Выход:

Port        Align-Err     FCS-Err    Xmit-Err     Rcv-Err  UnderSize  OutDiscards 
Gi0/3               0           0           23          0          0       315887 
Gi0/16              0         116           0         116          0           56 
Po1                 0      232464           0      232464          0     21331230 

Добавлен функциональный способ сделать это по запросу:

def getErrorList(array):
    return [i for i in array if any(x!="0" for x in i.split()[1:-2])] #check the range [1:-2] carefully. Use it as per your need.

print (getErrorList(array)) #take it in a variable for further processing
0 голосов
/ 23 января 2019
# your code goes here
array = [
        'Port        Align-Err     FCS-Err    Xmit-Err     Rcv-Err  UnderSize  OutDiscards ', 
        'Gi0/1               0           0           0           0          0       212086 ', 
        'Gi0/2               0           0           0           0          0       184832 ', 
        'Gi0/3               0           0           23          0          0       315887 ', 
        'Gi0/4               0           0           0           0          0       253439 ', 
        'Gi0/5               0           0           0           0          0       135034 ', 
        'Gi0/6               0           0           0           0          0       132617 ', 
        'Gi0/7               0           0           0           0          0         5816 ', 
        'Gi0/8               0           0           0           0          0        12266 ', 
        'Gi0/9               0           0           0           0          0       573217 ', 
        'Gi0/10              0           0           0           0          0       844880 ', 
        'Gi0/11              0           0           0           0          0       264766 ', 
        'Gi0/12              0           0           0           0          0       197496 ', 
        'Gi0/13              0           0           0           0          0            0 ', 
        'Gi0/14              0           0           0           0          0       372725 ', 
        'Gi0/15              0           0           0           0          0     14260434 ', 
        'Gi0/16              0         116           0         116          0           56 ', 
        'Gi0/17              0           0           0           0          0      6905901 ', 
        'Gi0/18              0           0           0           0          0       333387 ', 
        'Po1                 0      232464           0      232464          0     21331230 ', 
]

# Splits at space 
for row in array:
    rowData = row.split()
    if(rowData[2] != '0'):
        print(row)

, что дает

Port        Align-Err     FCS-Err    Xmit-Err     Rcv-Err  UnderSize  OutDiscards   
Gi0/16              0         116           0         116          0           56   
Po1                 0      232464           0      232464          0     21331230 
0 голосов
/ 23 января 2019

Пожалуйста, отредактируйте свой вопрос, не ясно.

Я предполагаю, что вы хотите, чтобы значения с одним или несколькими столбцами 'what-Err' не равнялись нулю

Вы можете сделать что-то вроде:

def f(arr):
    yield arr[0] # labels
    for elem in arr[1:]:
        _, align_err, fcs_err, xmit_err, rcv_err, *_ = elem.split()
        if any(map(lambda s: int(s) != 0, (align_err, fcs_err, xmit_err, rcv_err))):
            yield elem

Тогда используйте это так:


>>> for elem in f(array):
...     print(elem)
...
Port        Align-Err     FCS-Err    Xmit-Err     Rcv-Err  UnderSize  OutDiscards
Gi0/3               0           0           23          0          0       315887
Gi0/16              0         116           0         116          0           56
Po1                 0      232464           0      232464          0     21331230
0 голосов
/ 23 января 2019
ll= [ x.split() for x in array]
df = pd.DataFrame(ll)
df.columns = df.iloc[0]
df = df.reindex(df.index.drop(0))
df[['Align-Err', 'FCS-Err', 'Xmit-Err', 'Rcv-Err', 'UnderSize', 'OutDiscards']] = df[['Align-Err', 'FCS-Err', 'Xmit-Err', 'Rcv-Err', 'UnderSize', 'OutDiscards']].astype(int)

Я не получаю часть, в которой вы хотите найти элементы, не равные 0. Какие элементы?какой столбец?у вас есть ноль в каждой строке.

df = df[df != 0].dropna()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...