Существуют проблемы с вашими данными и сложности, которые мешают вам использовать join_by
или rec_join
в качестве предложенного вами вопроса.
Основная проблема с вашими данными, как указали другие, заключается в том, чточто сети, подобные IPv4Network('1.2.3.4/24')
, не являются действительными сетями, поскольку в них установлены биты хоста, которые маскируются /24
./24
означает, что последние 32 - 24 = 8
биты являются битами вашего хоста, а конструктор для IPv4Network
требует, чтобы они были установлены в 0, например, IPv4Network('1.2.3.0/24')
является действительным.
Основное осложнение заключается в том, чтоу вас есть сетей в одном массиве, но адресов в другом.Такие методы, как rec_join
и join_by
, используют сравнение (т. Е. ==
), чтобы решить, какие записи идут вместе.Некоторые из предложенных ответов «решают» это, заменяя ваши сети адресами, но это не является вашей проблемой.
Также обратите внимание, что один сетевой адрес может попадать в несколько разных сетей.Например, IPv4Address('1.2.3.129')
находится в пределах IPv4Network('1.2.3.0/24')
и IPv4Network('1.2.3.128/25')
.Итак, я предполагаю, что вы ожидаете, что оба совпадения будут отображаться в ваших результатах.
Чтобы объединить адреса из одного массива в сети, в которые фактически входит этот адрес, вам придется самостоятельно выполнить итерацию по массиву и создатьновенький.Тип работающего сравнения: IPv4Address('1.2.3.129') in IPv4Network('1.2.3.0/24')
(это True
).
Пример рабочего кода, объединяющий это:
from numpy import nan, asarray, concatenate
from ipaddress import IPv4Address, IPv4Network
a = asarray([
['GG', 'AA', IPv4Network('1.2.4.0/24')],
['GG', 'AB', IPv4Network('1.2.3.128/25')],
['GG', 'AC', IPv4Network('1.2.3.0/24')]
], dtype=object)
b = asarray([
['123456', 'A1', IPv4Address('1.2.3.4'), nan],
['987654', 'B1', IPv4Address('1.2.3.129'), nan],
['024680', 'C1', IPv4Address('1.2.4.0'), nan]
], dtype=object)
def join_addresses_networks(addresses, networks):
for address in addresses:
for network in networks:
if address[2] in network[2]:
yield concatenate((address, network[:-1]))
c = asarray(list(join_addresses_networks(b, a)))
print(c)