0

我对 Python 中的列表连接有疑问,我有这段代码:

def lista():
    word = sys.argv[1]
    l = []
    m = []
    for file_name in sys.argv[2:]:
        with open(file_name, "r") as f:
            for line in f:
                l + [len(re.findall(word, line))] #doesn't work
                m.append(len(re.findall(word, line))) #works
    print l
    print m
    return l 

当我运行这个函数时,我总是得到空列表 l,但是 m 中有元素,为什么 l+[elem] 对我不起作用?

4

4 回答 4

4

您永远不会为 l 分配新值。你应该使用赋值。试着打电话l = l + [len(re.findall(word,line))]

编辑:另一种选择是使用 += 运算符:l+=[len(re.findall(word,line))]

于 2012-04-20T09:31:35.007 回答
3

因为l+[len(re.findall(word,line))]只是添加两个列表但丢弃了结果。你可能想要

l+=[len(re.findall(word,line))]

一般意见:

  • 您的变量名称不符合PEP-8
  • 附加列表的成本很高,而且通常不是 Python 的。为此,您可以使用生成器。
  • 您应该对文件使用with语句,以确保即使发生异常也将其关闭。

这是带有建议编辑的程序。

def lista():
    word=sys.argv[1]
    def search():
        for file_name in sys.argv[2:]:
            with open(file_name,"r") as fin:
                for line in fin:
                    yield len(re.findall(word,line))
    return [l for l in search()]
于 2012-04-20T09:32:27.400 回答
2

在这里你只想使用l.append()- 你正在做的事情具有相同的效果,除了它的可读性和速度更慢。

python -m timeit -s "l=[]" "for i in range(1000):" "  l.append(i)"
10000 loops, best of 3: 106 usec per loop

python -m timeit -s "l=[]" "for i in range(1000):" "  l += [i]"
10000 loops, best of 3: 124 usec per loop
于 2012-04-20T09:37:35.270 回答
1
l = l+[len(re.findall(word,line))] #works
于 2012-04-20T09:34:31.650 回答