python - 是否有一种更 Pythonic 的方法可以将两个列表中元素的最大数量合并为一个
问题描述
我正在使用 scapy 在 python 中编写一个数据包差异工具来查找两个 pcap 文件中的差异,然后以人类可读的格式输出差异。该脚本单独比较每个数据包,并将不同的层/协议/im-not-that-much-of-a-networking-guy-sorry 分开进行单独比较。这就是我的困境开始的地方,你不知道存在哪些层,或者有多少层,或者是否有多个相同的层,或者两个数据包如何具有完全不同的层。我解决差异的计划是提取层的名称,然后将两个列表粉碎在一起,并使用该列表来了解我应该通过两个数据包查找哪种层。我不太确定这是否是最好的方法,但这是我真正能想到的。
tl;博士我需要弄清楚如何将两个图层名称列表“合并”在一起,以便我可以比较两个数据包
我试图写它,但我无法完全得到我想要的。然后我被告知它看起来像用 python 编写的 c 并使其更 Pythonic,我完全理解。
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"
(本来会显示照片但新帐户)
解决方案
你在寻找两个列表的联合吗?这应该有效:
layers_total = list(set(layers_1).union(set(layers_2)))
推荐阅读
- bash - docker-compose.yml 传递 arg 以从文件内容构建
- neural-network - GAN 中模式丢弃和模式崩溃之间的区别?
- c++ - 整数序列实现 C++
- java - 如何将 60 个整数存储在要从数据库写入/读取的类中?
- ios - Google Maps iOS Location 位于 MapView 的一角
- javascript - 使用ajax将js变量发送到php文件
- kotlin - 为可以包含自身实例的类自动生成适配器时,项目无法编译
- javascript - 列表中有多少项包含一个单词
- javascript - Node.js 将 html 启动到 localhost:8000,如何在该 html 文件中调用 .mp3/.mp4 文件
- angular - ngIf 不工作 Angular 7 第一次之后