【问题标题】:How to order a list of ip addresses [duplicate]如何订购IP地址列表[重复]
【发布时间】:2020-01-10 10:34:02
【问题描述】:

我正在尝试按顺序对以下列表进行排序:

the_list = ["192.168.0.1",
        "192.168.0.15", 
        "192.168.0.2", 
        "192.168.0.10", 
        "192.168.0.11",
        "192.168.0.24", 
        "192.168.0.8"
    ]

这会导致:

print(sorted(the_list))
[
    '192.168.0.1', 
    '192.168.0.10', 
    '192.168.0.11', 
    '192.168.0.15', 
    '192.168.0.2', 
    '192.168.0.24', 
    '192.168.0.8'
]

但我希望它像这样订购:

[
    '192.168.0.1', 
    '192.168.0.2', 
    '192.168.0.10', 
    '192.168.0.11', 
    '192.168.0.15', 
    '192.168.0.24', 
    '192.168.0.8'
]

所以基本上它是按最后一点之后的数字排序的,所以不是 .1、.10、.15、.2;它将是 .1、.2、.10、.15

【问题讨论】:

  • 标题讲述了一个不同的故事。
  • 这是一个列表,不是字典。
  • 为什么'192.168.0.8' 是最后一个?

标签: python


【解决方案1】:

Python 也有适合这个用例的电池!

import ipaddress

print(sorted(the_list, key=ipaddress.IPv4Address))

ipaddress 已经知道如何正确比较 IP 地址。

【讨论】:

    【解决方案2】:

    如果您的所有 IP 都以 192.168.0. 开头: 你可以使用这个 lambda 函数:

    the_list = ["192.168.0.1", "192.168.0.15", "192.168.0.2", "192.168.0.10", "192.168.0.11","192.168.0.24", "192.168.0.8"]
    the_list= sorted(the_list, key=lambda x:int( x.split('.')[-1]))
    

    否则,考虑到IP有这个结构xxx.xxx.xxx.xxx:

    the_list = ["193.168.0.1", "192.168.0.15", "192.168.0.2", "192.168.0.10", "192.169.0.11","191.168.0.24", "192.168.0.8"]
    the_list = sorted(the_list, key=lambda x:"".join([i.zfill(3) for i in x.split('.')]))
    

    【讨论】:

    • 这仅适用于所有以192.168.0开头的地址
    • @ElegantOdoo 我认为这是用户的情况,但是,我也添加了一般情况。感谢您的评论。
    【解决方案3】:

    试试这个:

    >>> def sort_key(key):
    ...     return int(key.split(".")[-1])
    ...
    >>> sorted(the_list, key=sort_key)
    ['192.168.0.1', '192.168.0.2', '192.168.0.8', '192.168.0.10', '192.168.0.11', '192.168.0.15', '192.168.0.24']
    >>>
    

    【讨论】:

      【解决方案4】:

      对于更一般的情况,当 i.p 在多个位置不同时 -

      from functools import cmp_to_key
      
      def sort_func(x, y):
          s_x = [int(z) for z in x.split(".")]
          s_y = [int(z) for z in y.split(".")]
          for i, j in zip(s_x, s_y):
              if i < j: return -1
              if j < i: return 1
          return 0
      
      sorted(the_list, key = cmp_to_key(sort_func))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-03
        • 2019-06-26
        • 1970-01-01
        • 2014-03-28
        • 2021-11-02
        • 2012-01-24
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多