使用map函数而不是for循环

时间:2011-04-12 09:47:22

标签: python map

我想在文件中找到行数和单词数。我的输入文件“testfile.txt”有6行和23个单词。用于查找单词数我使用map()函数而不是for循环。当我执行此代码时,它显示对象的内存位置而不是“23” “: 字数=

我在这里做错了什么?

def wordcount(l):
    global numwords
    words = l.split()
    numwords += len(words)

f=open('testfile.txt')
lines = f.readlines()
numlines = len(lines)
print ('Number of lines =', numlines)

numwords=0

numwords = map(wordcount, lines)
print ('Number of words =', numwords)

6 个答案:

答案 0 :(得分:2)

后:

numwords = map(wordcount, lines)

numwords是与None长度相同的lines列表,wordcount返回None

for line in lines:
    words = line.split()
    numwords += len(words)

会更好,更pythonic

答案 1 :(得分:2)

在Python 3中,map是一个迭代器:(类似于:itertools.imap

class map(object)
 |  map(func, *iterables) --> map object
 |  
 |  Make an iterator that computes the function using arguments from
 |  each of the iterables.  Stops when the shortest iterable is exhausted.

在Python 2中:

map(...)
    map(function, sequence[, sequence, ...]) -> list

默认情况下返回list

所以在你的情况下,你需要这样做:

numwords = list(map(wordcount, lines))

您的代码还存在其他问题,但其他人已经指出了这一点。

答案 2 :(得分:1)

你应该避免使用像'numwords'这样的全局变量。你必须在wordcount()函数中返回numwords。

此代码有效:

def wordcount(l):
    numwords = 0
    words = l.split()
    numwords += len(words)
    return numwords

f = open('testfile.txt')
lines = f.readlines()
numlines = len(lines)
print('Number of lines =', numlines)

numwords = 0
numwords = map(wordcount, lines)
print ('Number of words =', numwords)

我的testfile.txt包含:

Hello world
my name is
james bond

输出

('Number of lines =', 3)
('Number of words =', [2, 3, 2])

答案 3 :(得分:1)

阅读段落和......

print 'Num of words =', reduce(lambda x,y: x+y ,[len(line.split()) for line in lines])

答案 4 :(得分:0)

函数wordcount不返回任何内容,写return numwords现在你的函数计算numwords,然后默认返回None,并删除这个全局变量

答案 5 :(得分:0)

在这里,map或者返回一个列表或迭代器,所以这个修改将适用于任何一种情况。 (python2 vs python3)

def wordcount(l):
    global numwords
    words = l.split()
    numwords += len(words)

f=open('testfile.txt')
lines = f.readlines()
numlines = len(lines)
print ('Number of lines =', numlines)

numwords=0

numwords = map(wordcount, lines)
print ('Number of words =', len(list(numwords)))