Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于每个元组比较两个元组列表';s第一个值(但返回所有元组值)_Python_List_Set_Tuples_List Comprehension - Fatal编程技术网

Python 基于每个元组比较两个元组列表';s第一个值(但返回所有元组值)

Python 基于每个元组比较两个元组列表';s第一个值(但返回所有元组值),python,list,set,tuples,list-comprehension,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.c

我试图通过查找系统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.")]
正如我前面提到的,描述/客户名称可以来自“两个系统”列表中的任何一个系统,但是如果使用系统B的数据不需要太多额外的工作,那么系统B可能有更好/更干净的数据


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

您可以在FQDN上使用set操作来查找每个系统唯一的和同时在这两个系统上的数据,然后使用dicts根据FQDN查找设备名称:

# create FQDN -> device name dicts for each system
devices_a = dict(system_a_devices)
devices_b = dict(system_b_devices)

# create a set of FQDNs for each system
fqdn_set_a = set(system_a_devices.keys())
fqdn_set_b = set(system_b_devices.keys())

# compute FQDNs unique to each systems and those which are not unique
unique_fqdns_a = fqdn_set_a - fqdn_set_b
unique_fqdns_b = fqdn_set_b - fqdn_set_a
non_unique_fqdns = fqdn_set_a & fqdn_set_b

# now add device names using the FQDN -> device name dicts
system_a_unique = [(fqdn, devices_a[fqdn]) for fqdn in unique_fqdns_a]
system_b_unique = [(fqdn, devices_b[fqdn]) for fqdn in unique_fqdns_b]
# note: for FQDNs found on both systems, use the device name from system B
both_systems = [(fqdn, devices_b[fqdn]) for fqdn in non_unique_fqdns]

您可以在FQDN上使用set操作来查找每个系统唯一的设备名,以及在两个系统上都存在的设备名,然后使用DICS根据FQDN查找设备名:

# create FQDN -> device name dicts for each system
devices_a = dict(system_a_devices)
devices_b = dict(system_b_devices)

# create a set of FQDNs for each system
fqdn_set_a = set(system_a_devices.keys())
fqdn_set_b = set(system_b_devices.keys())

# compute FQDNs unique to each systems and those which are not unique
unique_fqdns_a = fqdn_set_a - fqdn_set_b
unique_fqdns_b = fqdn_set_b - fqdn_set_a
non_unique_fqdns = fqdn_set_a & fqdn_set_b

# now add device names using the FQDN -> device name dicts
system_a_unique = [(fqdn, devices_a[fqdn]) for fqdn in unique_fqdns_a]
system_b_unique = [(fqdn, devices_b[fqdn]) for fqdn in unique_fqdns_b]
# note: for FQDNs found on both systems, use the device name from system B
both_systems = [(fqdn, devices_b[fqdn]) for fqdn in non_unique_fqdns]
问一个更好的问题是我应该如何构建我的数据 系统A和系统B的输出,以更好地完成此任务(即列表 使用元组是个坏主意)

我必须说,是的,一个简单的移动到
dict
s将使这变得微不足道

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]
问一个更好的问题是我应该如何构建我的数据 系统A和系统B的输出,以更好地完成此任务(即列表 使用元组是个坏主意)

我必须说,是的,一个简单的移动到
dict
s将使这变得微不足道

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]

您可以使用
set(system\u a\u unique+system\u b\u unique)
开始。此后,您可能需要筛选组(“一”=“1”等),您可以使用
set(system\u a\u unique+system\u b\u unique)
开始。此后,您可能需要筛选组(“一”==“1”,等等),我重构了代码,使用字典而不是元组列表。我认为这是解决我的问题最简单的方法。谢谢我重构了我的代码,使用字典而不是元组列表。我认为这是解决我的问题最简单的方法。谢谢