python - 根据每个元组的第一个值比较两个元组列表(但返回所有元组值)

标签 python list set tuples list-comprehension

我试图通过查找系统 A 中唯一的设备、系统 B 中唯一的设备以及两个系统中都存在的设备来比较两个不同系统的输出。

现在,我的数据以元组列表的形式从两个系统中出来。我的示例数据如下所示:

system_a_devices = [("host1.test.local", "Test 1 Group"), ("host5.testing.lan", "LAN Test Group"), ("server5.hello.local", "Hello Corporation, Inc."), ("desktop1.corp.tld", "Corporate TLD, Ltd.")]

system_b_devices = [("desktop1.corp.tld", "Corporate TLD, Ltd."), ("host1.test.local", "Test One Group"), ("server6.hello.local", "Hello Corporation, Inc.")]

元组中的第一个值是主机的 FQDN,第二个值是设备的描述性名称(在此特定示例中,它是客户名称)。虽然最终结果中需要客户名称,但它们不一定需要匹配(请参阅“测试一组”和“测试一组”,但它们共享相同的 FQDN)。因此,最终结果可能包含字符串“Test 1 Group”或“Test One Group”,因为两者都适用于我想要完成的任务(尽管系统 B 很可能拥有最准确的客户名称数据)。

FQDN(元组中的第一个值)应该是确定每个系统的唯一值时唯一考虑的因素。此外,两个系统中的每一个都可以按任意随机顺序返回系统列表,并且每个系统中每个列表的元组数量(FQDN/客户名称配对)会有所不同。

我的最终结果应该与此类似:

system_a_unique = [("host5.testing.lan", "LAN Test Group"), ("server5.hello.local", "Hello Corporation, Inc.")]

system_b_unique = [("server6.hello.local", "Hello Corporation, Inc.")]

both_systems = [("host1.test.local", "Test One Group"), ("desktop1.corp.tld", "Corporate TLD, Ltd.")]

正如我之前提到的,描述/客户名称可以来自“both_systems”列表的任一系统,但如果使用系统 B 的数据不需要太多额外的工作,系统 B 可能拥有更好/更干净的数据。

我如何有效地完成这项任务?更好的问题是我应该如何构建系统 A 和系统 B 的数据输出以更好地实现这一点(即元组列表是一个坏主意)?

最佳答案

Would the better question to ask be how should I structure my data output from System A and System B to better accomplish this (i.e. list of tuples is a bad idea)?

我不得不说,是的,简单地迁移到 dict 将使这变得微不足道。

system_a_devices = {"host1.test.local": "Test 1 Group", "host5.testing.lan": "LAN Test Group", "server5.hello.local": "Hello Corporation, Inc.", "desktop1.corp.tld": "Corporate TLD, Ltd."}
system_b_devices = {"desktop1.corp.tld": "Corporate TLD, Ltd.", "host1.test.local": "Test One Group", "server6.hello.local": "Hello Corporation, Inc."}

现在您可以直接进行列表组合:

system_a_unique = [tup for tup in system_a_devices.items() if tup[0] not in system_b_devices]
system_b_unique = [tup for tup in system_b_devices.items() if tup[0] not in system_a_devices]
both_systems = [tup for tup in system_b_devices.items() if tup[0] in system_a_devices]

关于python - 根据每个元组的第一个值比较两个元组列表(但返回所有元组值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848965/

相关文章:

Python:无序集上的 .pop()

java - 如何让一个集合保留包含我在java中指定子字符串的所有字符串?

python - 使用Selenium + Python通过弹窗登录

python - 为什么将列表与整数进行比较不会出错?

python - 做位差的正确方法? ( python 2.7)

python - Python 中的 For Loop 没有正确地将列表分成子集

C# List .ConvertAll 效率和开销

python - 错误 : An exception has occurred, 使用 %tb 在 Python Jupyter Notebook 中查看 Dash App 的完整回溯

python - 查找并替换列表中的字符串 - Python

python - 无法使用 kwargs 解决 Django "NoReverseMatch"异常