如何在Python中对字典中存储的IP地址进行排序?
我有一段代码,看起来像这样:
ipCount = defaultdict(int)
for logLine in logLines:
date, serverIp, clientIp = logLine.split(" ")
ipCount[clientIp] += 1
for clientIp, hitCount in sorted(ipCount.items(), key=operator.itemgetter(0)):
print(clientIp)
它对 IP 进行排序,但是像这样:
192.168.102.105
192.168.204.111
192.168.99.11
这还不够好,因为它无法识别 99 是比 102 或 204 更小的数字。我希望输出为像这样:
192.168.99.11
192.168.102.105
192.168.204.111
我发现这个,但我不知道如何实现它在我的代码,或者如果有可能,因为我使用字典。我在这里有什么选择?
I have a piece of code that looks like this:
ipCount = defaultdict(int)
for logLine in logLines:
date, serverIp, clientIp = logLine.split(" ")
ipCount[clientIp] += 1
for clientIp, hitCount in sorted(ipCount.items(), key=operator.itemgetter(0)):
print(clientIp)
and it kind of sorts IP's, but like this:
192.168.102.105
192.168.204.111
192.168.99.11
which is not good enough since it does not recognize that 99 is a smaller number than 102 or 204. I would like the output to be like this:
192.168.99.11
192.168.102.105
192.168.204.111
I found this, but I am not sure how to implement it in my code, or if it is even possible since I use dictionary. What are my options here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
您可以使用自定义
key
函数返回字符串的可排序表示形式:split_ip()
函数采用 IP 地址字符串,例如'192.168.102.105'< /code> 并将其转换为整数元组
(192, 168, 102, 105)
。 Python 内置支持按字典顺序对元组进行排序。更新:实际上,使用
inet_aton() 可以更轻松地完成此操作
函数:socket
模块中的You can use a custom
key
function to return a sortable representation of your strings:The
split_ip()
function takes an IP address string like'192.168.102.105'
and turns it into a tuple of integers(192, 168, 102, 105)
. Python has built-in support to sort tuples lexicographically.UPDATE: This can actually be done even easier using the
inet_aton()
function in thesocket
module:使用排序的关键参数将您的 ip 转换为整数,例如:
编辑:
Gryphius 提出了一个使用套接字模块的解决方案,那么为什么不使用它来进行从 ip 到 long 的转换,因为它更干净:
Use the key parameter of sorted to convert your ip to an integer, for example:
EDIT:
Gryphius proposes a solution with the socket module, and so why not use it to make the conversion from ip to long as it is cleaner:
处理正确顺序的一种简洁方法是使用 Python ipaddress 模块。您可以将字符串转换为 IPv4Address 表示形式,然后对它们进行排序。这是一个使用列表对象的工作示例(使用 Python3 测试):
A clean way of handling the right order is using Pythons ipaddress module. You can transform the Strings into IPv4Address representations and sort them afterwards. Here's a working example with list objects (Tested with Python3):
在 https://www.lesinskis.com/python_sorting_IP_addresses.html 找到了解决方案
您所要做的就是将 ipaddress 中的 ip 字符串转换
Found a solution at https://www.lesinskis.com/python_sorting_IP_addresses.html
All you have to do is convert the string of ip in ipaddress
在 python 3 中
使用如下:
当 IP 地址是无类域间路由 (CIDR) 时,使用:
in python 3
use like this:
and when IP addresses are Classless Inter-Domain Routing (CIDR) use:
如果你的应用程序做了很多事情,比如“在范围 x 中查找 ip”、“按 ip 排序”等,那么在内部存储 ip 的数值并使用它通常会更方便。
使用此函数将数字转换回 ip:
if your application does lots of things like "find ips in range x", "sort by ip" etc its often more convenient to store the numeric value of the ip internally and work with this one.
convert the number back into an ip using this function:
我想到的两个明显的问题是:
sorted()
函数。哪个最好取决于您必须处理的数据量(您会注意到方法#1仅在处理大量数据时性能有所提高)以及您需要对所述排序执行的操作IP 列表(例如,如果您预先格式化字符串,则可能需要在将它们作为参数提供给其他函数之前再次更改它们)。
预格式化示例
将 IP 保持为字符串,但使用空格或零来解决可变位数问题:
排序函数示例
嗯...Ferdinand Beyer 在 <一个href="https://stackoverflow.com/questions/6545023/how-to-sort-ip-addresses-stored-in-dictionary-in-python/6545090#6545090">他的答案似乎已经为这种方法提供了一个很好的解决方案! :)
The two obvious one that come to my mind are:
sorted()
function when you perform the ordering.Which is best depends from the amount of data you have to process (you will notice an increased performance for method #1 only for very large amount of data) and from what you will need to do with said sorted list of IP (if you preformat the strings, you might then need to change them again before feeding them as arguments to other functions, for example).
Example of preformatting
Maintain the IP as a string, but uses spaces or zeroes to solve the variable number of digits problem:
Example of sorting function
Well... Ferdinand Beyer in his answer seems to have already offered an excellent solution for this approach! :)
我认为这会对您有所帮助:PEP265(按值排序字典)。只需扩展排序功能即可。
I think this will help you: PEP265 (sorting dictionieries by value). Just extend the sorted function.
如果要对 IPv4/6 地址字符串列表进行排序,至少对于 python3 来说,正确且最简单的解决方案是转换为 ipaddress 对象并使用 ipaddress.get_mixed_type_key。
If you want to sort a list of IPv4/6 address strings, the correct and simplest solution, for python3 at least, is to convert to ipaddress objects and sort with ipaddress.get_mixed_type_key.
完全不使用字符串,而是将每个八位字节转换为整数,然后将其传递到 4 维字典中怎么样?
那么按键对数组进行排序就很容易了,不是吗?
出于速度原因,将简单的 python 字典与
OrderedDict
进行比较可能会有所帮助。how about not working with strings at all and instead convert each octet into integer, then passing it into 4 dimensional dictionary?
then it is easy to just sort an array by key, isnt it?
for speed reasons it may be beneficial to also compare simple python dictionary against
OrderedDict
.