【问题标题】:Resetting Python list contents in nested loop在嵌套循环中重置 Python 列表内容
【发布时间】:2016-02-12 13:50:44
【问题描述】:

我有一些这种格式的文件,我需要返回最旧和最新的文件以传递给函数进行解析

Nv_NODE_DATE_TIME

我希望输出是

Nv_stats_172550_160211_230030
Nv_stats_172550_160212_142624
Nv_stats_75AKPD0_160211_230030
Nv_stats_75AKPD0_160212_142624

但我得到的是绝对的第一项和绝对的最后一项

Nv_stats_172550_160211_230030
Nv_stats_75AKPD0_160212_142624
Nv_stats_172550_160211_230030
Nv_stats_75AKPD0_160212_142624

这是当前代码

import os

iostatslocalpath="/root/svc/testing/"
svchost='SVC_Cluster01'
nodenames=['75AKMX0', '75AKPD0', '172550', '172561']

filelist=sorted(os.listdir(iostatslocalpath+svchost+'/.'))
totalfilenumber=len(filelist)

def parse(filename, length):
        print filename[0]
        print test[length-1]

for nodename in nodenames:
        test=[]
        test[:]=[]
        for file in filelist:
                if nodename and "Nv" in file:
                        test.append(file)
        parse(test, len(test))

我可能忽略了一些小问题,任何帮助将不胜感激

【问题讨论】:

  • 你在哪里告诉它按日期时间排序?
  • 我在 parse 函数中添加了一个可能的错误,并在 if 中指出了错误。

标签: python list loops reset


【解决方案1】:

注意

def parse(filename, length):
    print filename[0]
    print test[length-1]

使用测试。你应该成功了

def parse(filename, length):
    print filename[0]
    print filename[length-1]

然后

if nodename and "Nv" in file:

先做in,然后做and。 5.15. Operator precedence 因此相当于

if (nodename) and ("NV" in file):

由于您正在循环节点名,因此第一部分始终为真。

你可能想要使用

if (nodename in file) and ("Nv" in file):

【讨论】:

    【解决方案2】:

    除了 sabbahillel 所说的,test 返回了正确的列表,但是这个 parse 函数看起来很奇怪,因为你要求它打印列表中的第一项,然后是最后一项,所以它不会打印所有文件如你所愿。以下代码将正确打印它,尽管我相信您的 parse 函数是您困惑的根源:

    import os
    
    iostatslocalpath="/root/svc/testing/"
    svchost='SVC_Cluster01'
    nodenames=sorted(['75AKMX0', '75AKPD0', '172550', '172561'])
    
    filelist=sorted(os.listdir(iostatslocalpath+svchost+'/.'))
    # print filelist
    totalfilenumber=len(filelist)
    
    def parse(filename, length):
            print filename[0]
            print test[length-1]
    
    for nodename in nodenames:
            test=[]
            test[:]=[]
            for file in filelist:
                    if nodename in file and "Nv" in file:
                            test.append(file)
            for x in test:
                print(x)
    

    输出:

    Nv_stats_172550_160211_230030
    Nv_stats_172550_160212_142624
    Nv_stats_75AKPD0_160211_230030
    Nv_stats_75AKPD0_160212_142624
    

    所以 x 是按您希望的顺序排列的文件,然后您按照自己的意愿解析它们。

    【讨论】:

    • 谢谢,原来我应该使用 print filename[length-1] 而不是 print test[length-1] 以及修改后的 and 语句
    • 此外,这仅适用于 len 2 的列表,因为您不会打印每个元素,而只会打印第一个和最后一个元素。并且filename[length-1] 不是必需的,filename[-1] 在 python 中工作正常。最后,你能接受我的回答吗?
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2023-03-25
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2013-03-09
    相关资源
    最近更新 更多