2012-04-20 57 views
0

我有一个关于在Python列表连接的问题,我有这样的一段代码: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,但也有元素男,为什么l + [elem] doesen't不为我工作?

+0

注释:L是一个糟糕的变量名:http://www.python.org/dev/peps/pep-0008/ – jamylak 2012-07-13 09:14:30

回答

4

您从不为l分配新值。你应该使用分配。 尝试调用l = l + [len(re.findall(word,line))]

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

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()] 
+0

感谢编辑。 – Andna 2012-04-20 09:45:49

1
l = l+[len(re.findall(word,line))] #works 
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