首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件/列表中隔离参数

从文件/列表中隔离参数
EN

Stack Overflow用户
提问于 2012-11-04 12:06:25
回答 1查看 85关注 0票数 2

我正在尝试编写一个函数,该函数打开一个包含姓名、城市和数字列表的文件,并按城市取这些数字的平均值。

到目前为止,我得到了一些类似的东西:

代码语言:javascript
复制
numbers = 0
count = 0
n = 0
while n < len(file):
    for item in file:
        if item.split(' ')[-2] == city:
            count += 1
            numbers += float(item.split(' ')[-1])
            n += 1
        else:
            n += 1
    return numbers / count

其中-2是城市的位置,-1是数字的位置。假设文件已经打开。

我的代码遍历整个文件,并且只返回最后一行上的内容。因此,如果文件中的最后一行有来自伦敦的人,并且我试图计算伦敦的平均值,它将只给我一个数字;如果我试图计算其他城市的平均值,它将不会返回任何结果。

为什么它在没有更新我的计数的情况下循环遍历整个文件,我如何修复它?

编辑:

编辑了代码,文件如下所示:

代码语言:javascript
复制
NAME1     COUNTRY     CITY     NUMBER

在每行上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-04 15:52:30

首先,item.split(‘')产生如下内容:

代码语言:javascript
复制
['foo', '', '', '', '', 'spam', '', 'foo', '', '666'] 

如果一行中有多个空格。使用item.split()

其次,file对象有iteration接口,所以可以这样迭代文件行:

代码语言:javascript
复制
for line in open('city.dat'):
    data = line.split()
    if data[-2] == 'CITYNAME':
       count += 1
       numbers += float(data[-1])

第三,确保文件中存在'CITYNAME‘

为了防止不必要的文件读取和拆分,最好将准备好的数据存储在内存中:

代码语言:javascript
复制
data = map(lambda x: x.split(), open('city.dat'))

并根据需要对其进行过滤:

代码语言:javascript
复制
filtered_cities = filter(lambda x: x[-2] == 'CITYNAME', data)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13215968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档