使用看到的时间戳动态创建和搜索 IP 字典
dynamically create and search a dictionary of IPs with their seen timestamps
初学者 python 用户在这里
我读取了一个包含 IP 地址和时间戳的日志文件,并希望创建一个列表,其中包含每个 IP 以显示看到该 IP 的时间。
所以一个IP可以有多个时间戳。
我认为集合字典可以完成这项工作,但我无法弄清楚如何动态创建它。
示例数据
10.1.1.10 1441110489
10.1.1.15 1441110490
10.1.1.10 1441110491
10.1.1.11 1441110492
10.1.1.10 1441110492
10.1.1.11 1441110493
应该导致
10.1.1.10 1441110489,1441110491,1441110492
10.1.1.11 1441110492,1441110493
10.1.1.15 1441110490
这部分是下面的自我回答。
额外问题:稍后我想在此数据中搜索时间戳,但时间不多 window。所以不是完全匹配。我想我需要遍历所有数据以进行搜索? (我可以 post 这作为一个单独的问题)
来自 Adding elements to a dictionary of sets 我做了这个:
>>> from collections import defaultdict
>>> iplist=defaultdict(set)
>>> iplist["10.1.1.10"].add(1441110489)
>>> iplist["10.1.1.15"].add(1441110490)
>>> iplist["10.1.1.10"].add(1441110491)
>>> iplist["10.1.1.11"].add(1441110492)
>>> iplist["10.1.1.10"].add(1441110492)
>>> iplist["10.1.1.11"].add(1441110493)
>>> iplist
defaultdict(<type 'set'>, {'10.1.1.11': set([1441110492, 1441110493]), '10.1.1.10': set([1441110489, 1441110491, 1441110492]), '10.1.1.15': set([1441110490])})
下面的方法怎么样:
import collections
def get_ip_address(start_time, end_time):
global d_entries
matching_ip = set()
for k, v in d_entries.items():
for timestamp in v:
if start_time <= timestamp <= end_time:
matching_ip.add(k)
return matching_ip
ip_list = [
"10.1.1.10 1441110489",
"10.1.1.15 1441110490",
"10.1.1.10 1441110491",
"10.1.1.11 1441110492",
"10.1.1.10 1441110492",
"10.1.1.11 1441110493"]
d_entries = collections.defaultdict(list)
for ip_entry in ip_list:
ip, timestamp = ip_entry.split(" ")
d_entries[ip].append(int(timestamp))
print get_ip_address(1441110490, 1441110492)
这将显示 3 个匹配项,如下所示:
set(['10.1.1.11', '10.1.1.10', '10.1.1.15'])
初学者 python 用户在这里
我读取了一个包含 IP 地址和时间戳的日志文件,并希望创建一个列表,其中包含每个 IP 以显示看到该 IP 的时间。 所以一个IP可以有多个时间戳。 我认为集合字典可以完成这项工作,但我无法弄清楚如何动态创建它。
示例数据
10.1.1.10 1441110489
10.1.1.15 1441110490
10.1.1.10 1441110491
10.1.1.11 1441110492
10.1.1.10 1441110492
10.1.1.11 1441110493
应该导致
10.1.1.10 1441110489,1441110491,1441110492
10.1.1.11 1441110492,1441110493
10.1.1.15 1441110490
这部分是下面的自我回答。
额外问题:稍后我想在此数据中搜索时间戳,但时间不多 window。所以不是完全匹配。我想我需要遍历所有数据以进行搜索? (我可以 post 这作为一个单独的问题)
来自 Adding elements to a dictionary of sets 我做了这个:
>>> from collections import defaultdict
>>> iplist=defaultdict(set)
>>> iplist["10.1.1.10"].add(1441110489)
>>> iplist["10.1.1.15"].add(1441110490)
>>> iplist["10.1.1.10"].add(1441110491)
>>> iplist["10.1.1.11"].add(1441110492)
>>> iplist["10.1.1.10"].add(1441110492)
>>> iplist["10.1.1.11"].add(1441110493)
>>> iplist
defaultdict(<type 'set'>, {'10.1.1.11': set([1441110492, 1441110493]), '10.1.1.10': set([1441110489, 1441110491, 1441110492]), '10.1.1.15': set([1441110490])})
下面的方法怎么样:
import collections
def get_ip_address(start_time, end_time):
global d_entries
matching_ip = set()
for k, v in d_entries.items():
for timestamp in v:
if start_time <= timestamp <= end_time:
matching_ip.add(k)
return matching_ip
ip_list = [
"10.1.1.10 1441110489",
"10.1.1.15 1441110490",
"10.1.1.10 1441110491",
"10.1.1.11 1441110492",
"10.1.1.10 1441110492",
"10.1.1.11 1441110493"]
d_entries = collections.defaultdict(list)
for ip_entry in ip_list:
ip, timestamp = ip_entry.split(" ")
d_entries[ip].append(int(timestamp))
print get_ip_address(1441110490, 1441110492)
这将显示 3 个匹配项,如下所示:
set(['10.1.1.11', '10.1.1.10', '10.1.1.15'])