Есть ли более питонный способ объединить максимальное количество элементов из двух списков в один - PullRequest
0 голосов
/ 31 мая 2019

Я пишу инструмент сравнения пакетов на python, используя scapy, чтобы найти различия в двух файлах pcap, а затем вывести разницу в удобочитаемом формате.Сценарий сравнивает каждый пакет на индивидуальной основе и разделяет различные уровни / протоколы / я не из тех, кто много работает, извините, чтобы сравнивать по отдельности.Именно здесь начинается моя дилемма: вы не знаете, какие уровни присутствуют, или сколько, или если их несколько, или как два пакета могут иметь совершенно разные уровни.Мой план прохождения различий состоял в том, чтобы вытащить имена слоев, а затем разбить два списка вместе и использовать этот список, чтобы узнать, для каких слоев я должен просматривать два пакета.Я не совсем уверен, что это лучший способ, но это все, о чем я могу думать.Если у вас есть идея, как это сделать, ПОЖАЛУЙСТА, поделитесь

tl; dr Мне нужно выяснить, как «объединить» два списка имен слоев, чтобы я мог сравнить два пакета

Я пытался написать это, но я не мог получить то, что хотел.Затем мне сказали, что это выглядит как c, написанное на python, и чтобы сделать его более питоническим, что я полностью понимаю.

def get_common_layers(layers_1, layers_2):  # doesn't quite work
    layers_total = []
    i = 0
    while i < len(layers_1):
        temp_count = layers_1.count(layers_1[i])
        if layers_1[i] not in layers_total:
            if layers_1[i] not in layers_2:
                layers_total.extend(layers_1[i:i + temp_count])
            elif layers_1[i] in layers_2:
                if temp_count >= layers_2.count(layers_1[i]):
                    layers_total.extend(layers_1[i:i + temp_count])
        i = i + temp_count
    i = 0
    while i < len(layers_2):
        temp_count = layers_2.count(layers_2[i])
        if layers_2[i] not in layers_total:
            if layers_2[i] not in layers_1:
                layers_total.extend(layers_2[i:i + temp_count])
            elif layers_2[i] in layers_1:
                if temp_count >= layers_1.count(layers_2[i]):
                    layers_total.extend(layers_2[i:i + temp_count])
        i = i + temp_count
    return layers_total

Это немного похоже, но немного не так.Мне очень жаль, что я не смог объяснить, что я имею в виду, но единичное тестирование и требуемый ввод и вывод должны дать немного лучшее изображение

желаемый ввод и вывод:

layers_1 = ['Ether', 'UDP', 'DNS', 'DNSQR', 'DNSQR', 'DNSQR', 'DNSRR'],
layers_2 = ['Ether', 'TCP', 'DNS', 'DNSRR', 'DNSRR', 'DNSQR'])

layers_total = ['Ether', 'UDP', 'TCP', 'DNS', 'DNSQR', 'DNSQR', 'DNSQR', 'DNSRR', 'DNSRR']

снимок экрана с ошибкой, которую показывает unittest: https://imgur.com/UFi92jY.png "unittest"

снимок экрана с тем, что я на самом деле пытаюсь сделать: https://imgur.com/eMZNX5V.png "example_output"

(были бы фотографии, но новый аккаунт)

1 Ответ

0 голосов
/ 31 мая 2019

Вы ищете объединение двух списков? Это должно работать:

layers_total = list(set(layers_1).union(set(layers_2)))
...