【问题标题】:Making a list from a loop output从循环输出制作列表
【发布时间】:2018-01-02 17:25:16
【问题描述】:
data = ['network 10.185.16.64 255.255.255.224','network 55.242.33.0 255.255.255.0','network 55.242.154.0 255.255.255.252']

pref_network_find = re.findall('(\S+\s+255.255.255.\w+)',str(data))

mydict = {"255.255.255.0":24,"255.255.255.128":25,"255.255.255.192":26,"255.255.255.224":27,"255.255.255.240":28,"255.255.255.248":29,"255.255.255.252":30}

for i in pref_network_find:
 splitlines = i.split()
 for word in splitlines:
    if word in mydict:
        i = i.replace(word,str(mydict[word]))
        pref = print (i)
listi = []
for line in pref_network_find:
   listi.append(i)
print (listi)

10.185.16.64 27
55.242.33.0 24
55.242.154.0 30
['55.242.154.0 30', '55.242.154.0 30', '55.242.154.0 30']

Process finished with exit code 0

我试图在最后将['55.242.154.0 30', '55.242.33.0 24', '10.185.16.64 27'] 设置为list1,但在这里无法理解我的错误。你能帮我解决这个问题吗?

【问题讨论】:

    标签: python python-2.7 list for-loop


    【解决方案1】:

    您不需要使用正则表达式获取初始拼接和加入的 IP;相反,只需使用str.split():

    import re
    data = ['network 10.185.16.64 255.255.255.224','network 55.242.33.0 255.255.255.0','network 55.242.154.0 255.255.255.252']
    mydict = {"255.255.255.0":24,"255.255.255.128":25,"255.255.255.192":26,"255.255.255.224":27,"255.255.255.240":28,"255.255.255.248":29,"255.255.255.252":30}
    
    final_list = sorted(['{} {}'.format(b, mydict[c]) for a, b, c in [i.split() for i in data]], key=lambda x:map(int, re.split('\.|\s', x)), reverse=True)
    

    输出:

    ['55.242.154.0 30', '55.242.33.0 24', '10.185.16.64 27']
    

    【讨论】:

    • 我讨厌这样的一行代码。如果至少格式不正确,我发现很难阅读。您需要了解屏幕上的代码所需的所有信息。您的 sorted 函数需要 3 个参数,如果您在其中每个参数使用 1 行,您的代码可以获得很好的可读性。您的行有 152 个字符长,而且太长了。通常的最大值在 80 到 100 之间。你不同意吗? + 如果不适合你,教年轻的编码员不礼貌的编码是可悲的吗?
    • @IMCoins 你肯定对可读性有意见,尽管我认为对于使用 Python 的年轻程序员来说,向他们介绍 Python 必须提供的功能是有意义的,包括强大的内置函数和整体简洁性。此外,我们应该尽量鼓励用户尽可能地使用 Pythonic(尽管 Pythonic 有点主观)。 Python 有这么大的力量,为什么不使用它并让其他人使用它呢?
    • 我完全同意你的观点Additionally, we should be trying to encourage users to be as Pythonic as possible (although Pythonic is somewhat subjective).。以及您的消息中与此相关的所有主题。但。我必须说,您可以在示例中以相同的方式显示所有内容,就像您所做的那样,只需插入两个 '\n' 和几个 '\t'。我们都应该小心这条规则。这就像我们的宪法!
    【解决方案2】:

    显然,它会在最后打印 30,因为您的此代码

    for i in pref_network_find:
     splitlines = i.split()
     for word in splitlines:
        if word in mydict:
            i = i.replace(word,str(mydict[word]))
            pref = print (i)
    

    执行后我是 30。而你正在使用这样的旧变量'i'

    for line in pref_network_find:
       listi.append(i)
    

    所以是的,代码做得很好,i 是 30,它会将 30 附加到您的结果中。

    正确的代码是这样的。

    import re
    
    data = ['network 10.185.16.64 255.255.255.224','network 55.242.33.0 255.255.255.0','network 55.242.154.0 255.255.255.252']
    pref_network_find = re.findall('(\S+\s+255.255.255.\w+)',str(data))
    mydict = {"255.255.255.0":24,"255.255.255.128":25,"255.255.255.192":26,"255.255.255.224":27,"255.255.255.240":28,"255.255.255.248":29,"255.255.255.252":30}
    listi = []
    for i in pref_network_find:
     splitlines = i.split()
     for word in splitlines:
        if word in mydict:
            i = i.replace(word,str(mydict[word]))
            pref = print (i)
            listi.append(i)
    
    print (listi)
    

    如果我在这里错了,请纠正我,也许你想要别的东西,但是,这是我对你的问题的理解。

    【讨论】:

    • 是的,伙计,谢谢!我只是一个初学者,正在编写我的第一个脚本来学习新事物。
    【解决方案3】:

    您的代码错误,因为您在此处附加了错误的索引i

    for line in pref_network_find:
        listi.append(i)
    

    我们在上一个循环中的i = 55.242.154.0 中有最后一个值。您应该使用line 而不是i 或直接追加for循环

    data = ['network 10.185.16.64 255.255.255.224','network 55.242.33.0 255.255.255.0','network 55.242.154.0 255.255.255.252']
    
    pref_network_find = re.findall('(\S+\s+255.255.255.\w+)',str(data))
    
    mydict = {"255.255.255.0":24,"255.255.255.128":25,"255.255.255.192":26,"255.255.255.224":27,"255.255.255.240":28,"255.255.255.248":29,"255.255.255.252":30}
    
    listi = []
    
    for i in pref_network_find:
        splitlines = i.split()
        for word in splitlines:
            if word in mydict:
                listi.append(i.replace(word, str(mydict[word])))
    
    print(listi)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多