【问题标题】:How can I get the list sorted out according to the IP address?如何根据 IP 地址排序列表?
【发布时间】:2016-08-17 07:10:07
【问题描述】:
#!/usr/bin/python
# -*- encoding:utf8 -*-

import sys
import fileinput
import socket

hostlist= ['www.yahoo.com','www.google.com', 'www.facebook.com', 'www.cnn.com', 'www.thetimes.com']

for line in hostlist:
    for hostnames in line.split():
        try:
            socket.gethostbyname(hostnames)
        except Exception as invalid_hostnames:
            print ('Invalid hostname address = ') + hostnames
        else:
            ip = socket.gethostbyname(hostnames)
            print (ip.ljust(30,' ')) + '' + (hostnames.ljust(30,' '))

输出如下

46.228.47.115                 www.yahoo.com                 
123.176.0.162                 www.google.com                
179.60.192.36                 www.facebook.com              
185.31.17.73                  www.cnn.com                   
54.229.184.19                 www.thetimes.com

是否可以根据解析的IP地址排序输出?

【问题讨论】:

  • 好像已经解决了here

标签: python


【解决方案1】:

试试:

import socket

results = []

with open('hostnames_list.txt') as f:
    for hostname in f:
        try:
            ip = socket.gethostbyname(hostname.strip())
        except socket.gaierror:
            ip = socket.gethostbyname('.'.join(hostname.strip().split('.')[1:]))
        results.append((ip, hostname.strip()))

for (ip, hostname) in sorted(results, key=lambda item: socket.inet_aton(item[0])):
    print (ip.ljust(30,' ')) + '' + (hostname.ljust(30,' '))

注意:看到我正在使用socket.inet_aton 来转换 IPv4 点分四进制字符串格式的地址(例如,“123.45.67.89”) 以 32 位压缩二进制格式,作为长度为四个字符的字符串。这样,您就可以对它们进行正确排序。

例如

data = [
        ('31.13.73.36', 'google.com'),
        ('31.13.72.35', 'foo.bar'),
        ('31.13.72.36', 'somedomain.com')
]
print sorted(data, key=lambda item: socket.inet_aton(item[0]))

将输出:

[
    ('31.13.72.35', 'foo.bar'),
    ('31.13.72.36', 'somedomain.com'),
    ('31.13.73.36', 'google.com')
]

【讨论】:

  • 您的上述方法完美运行 :) 是否可以传递主机名列表并获得相同的输出?
  • @iqzer0,它实际上是在获取主机名列表:hostlist。你想让它成为一个函数还是什么?
  • 我想传递一个主机名列表文件,例如:hostlist.txt www.google.com www.yahoo.com www.facebook.com
  • @AndrésPérez-AlbelaH。你不是只按第一个八位字节排序吗?如果它们是一样的呢?
  • 我在一个文件中有一个巨大的主机名列表,我想根据所有八位字节对它进行排序 172.168.0.1 192.168.0.1 192.168.1.1 192.168.2.1 192.168.2.3可以帮助我:)
【解决方案2】:

例如,您应该首先生成(hostname, ip) 形式的条目列表。生成该列表后,使用sorted() 对其进行迭代并打印出内容。

例如,不要打印,而是制作一个列表:

 result = []

并将您的条目附加到该列表中,而不是将它们打印出来:

result.append((hostname, ip))

然后,在处理完所有项目后,将它们排序打印出来:

for hostname, ip in sorted(result, key=lambda v: v[1]):
    print (ip.ljust(30,' ')) + '' + (hostnames.ljust(30,' '))

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 2011-09-09
    • 2022-01-25
    • 2018-07-19
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多