【问题标题】:Every time I print a list, it prints the elements 2 times. How can I prevent that from happening? [closed]每次我打印一个列表时,它都会打印元素 2 次。我怎样才能防止这种情况发生? [关闭]
【发布时间】:2020-06-18 16:02:52
【问题描述】:
import os
from netaddr import *
import sys
import socket
from pprint import pprint
from collections import defaultdict
import itertools
import bisect

    ip_list = []
    server_list = []
    while True:
        try:
            server = (input('> '))
            if server == 'q':
                break
            ip_addr = socket.gethostbyname(server)
        except socket.gaierror:
            print(server, 'can\'t find server/ip', '\n')

        ip_list.append(ip_addr)
        server_list.append(server)
        print(ip_list)

输出(在这种情况下我输入 2 个服务器并返回 2 个 IP):

['10.0.0.1', '10.0.0.2']

现在,当我将该列表插入到脚本的总体用途中时,它会打印出两次列表。 为简单起见,“网络”会拉出子网/路由列表,但我将忽略该代码,因为它与手头的问题无关。

    for ip_address in ip_list:
        if IPAddress(ip_address) in IPNetwork(network):
            print(ip_address)

输出:

10.0.0.1
10.0.0.2
10.0.0.1
10.0.0.2

如何使地址打印一次而不是两次?

【问题讨论】:

  • 将打印移出循环。
  • 什么是 IPAddress 和 IPNetwork ?上课?
  • @OlvinR​​oght 将打印移出循环是什么意思?如果这样做,我会收到缩进错误。
  • 您是否打算将无法找到的服务器添加到列表中?你在try之外有ip_list.append(ip_addr),所以即使出现错误也会完成。
  • 所以我发现我在输出中有两个条目,因为 10.0.0.1 和 10.0.0.2 返回并打印出默认路由 @ 0.0.0.0/0 并且它们还返回路由 10.0.0.0 /24。我想知道我如何能够排除默认路由而不必每次都排除它,因为 0.0.0.0/0 将适用的边缘情况

标签: python list networking printing


【解决方案1】:

在循环完成后执行print(ip_list),因此您只打印一次,而不是每次附加到它之后。

此外,您应该附加到try 内的列表中。否则,当您收到错误时,您仍然会附加服务器,并且还会附加上一个服务器的地址。

ip_list = []
server_list = []
while True:
    try:
        server = (input('> '))
        if server == 'q':
            break
        ip_addr = socket.gethostbyname(server)
        ip_list.append(ip_addr)
        server_list.append(server)
    except socket.gaierror:
        print(server, 'can\'t find server/ip', '\n')

print(ip_list)
print(server_list)

【讨论】:

  • 我会使用 else 块来追加列表,你怎么看?
猜你喜欢
  • 2018-10-05
  • 2020-10-16
  • 2022-01-21
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多