Как перебрать список и объединить данные - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь перебрать список, в котором есть IP-адрес источника, IP-адрес назначения, время и длина пакета. Если есть какие-либо строки, которые содержат одинаковый исходный IP-адрес и целевой IP-адрес, мне нужно удалить дублированные строки и показать время начала, время окончания и общую длину пакета.

def combine_data(source, dest, time, length):
    CombinePacket = []
    CombinePacket = [(source[i], dest[i], time[i], length[i]) for i in range(len(source))]
    counter = 0
    line = []

    for i, j in zip(source, dest):
        if(source[counter] and dest[counter] == source[counter+1] and dest[counter+1]):
            print(CombinePacket[counter-1], CombinePacket[counter])
            counter+=1
    return 0 


(['172.217.2.161'], ['10.247.15.39'], '13:25:31.044180', '0') 

(['172.217.2.161'], ['10.247.15.39'], '13:25:31.044371', '46')

Я ожидаю объединить линии, и это должно выглядеть так:

(['172.217.2.161'], ['10.247.15.39'], '13:25:31:044180', '13:25:31:044371', '46')

1 Ответ

0 голосов
/ 25 октября 2019

Вы не добавили некоторые данные в тестовый код, и я не знаю, является ли это вашей проблемой, но вы неправильно сравниваете значения в

source[counter] and dest[counter] == source[counter+1] and dest[counter+1]

, потому что это означает

(source[counter]) and (dest[counter] == source[counter+1]) and (dest[counter+1])

Вы должны сравнить каждый элемент отдельно

source[counter] == source[counter+1] and dest[counter] == dest[counter+1]

или вы можете сравнить кортежи или списки

(source[counter], dest[counter]) == (source[counter+1], dest[counter+1])

Вместо zip(source, dest): вы можете использовать zip(CombinePacket, CombinePacket[1:]), и вы будетеимеют обе комбинированные строки, которые можно использовать для создания новой. И вы получите все данные в виде списка, чтобы вы могли сравнивать списки с [source, dest]

results = []

for x, y in zip(combine_packet, combine_packet[1:]):
    if (x[0:2] == y[0:2]):  # `[source, dest]`
        data = [x[0], x[1], x[2], y[2], y[3]]
        print(data)  # (['172.217.2.161'], ['10.247.15.39'], '13:25:31:044180', '13:25:31:044371', '46')
        results.append(data)

Но я не знаю, может ли быть три строки с одинаковым source, dest и какого результата вы ожидаетеэти три ряда.


def combine_data(source, dest, time, length):

    combine_packet = list(zip(source, dest, time, length))

    results = []

    for x, y in zip(combine_packet, combine_packet[1:]):
        if (x[0:2] == y[0:2]):
            #print(x)  # (['172.217.2.161'], ['10.247.15.39'], '13:25:31.044180', '0') 
            #print(y)  # (['172.217.2.161'], ['10.247.15.39'], '13:25:31.044371', '46')
            data = [x[0], x[1], x[2], y[2], y[3]]
            print(data)  # (['172.217.2.161'], ['10.247.15.39'], '13:25:31:044180', '13:25:31:044371', '46')
            results.append(data)

    return results


source = [['172.217.2.161'], ['172.217.2.161'], ['0.0.0.0']]
dest   = [['10.247.15.39'], ['10.247.15.39'], ['10.247.15.39']]
time   = ['13:25:31.044180', '13:25:31.044371', '13:25:31.044371']
length = ['0', '46', '123']

combine_data(source, dest, time, length)
...