我有一个.tsv文件数据文件,名为world_bank_indicators。
我有另一个tsv文件,其中包含我需要附加到脚本中的列表项的其他信息。该文件名为world_bank_regions
到目前为止,我有代码(感谢本网站上的一些好人)从世界银行指标过滤我需要的数据,并将其作为2D列表写入变量mylist。另外,我有代码在第二个文件中读取字典。代码如下:
from math import log
import csv
import re
#filehandles for spreadsheets
fhand=open("world_bank_indicators.txt", "rU")
fhand2=open("world_bank_regions.txt", "rU")
#csv reader objects for files
reader=csv.reader(fhand, dialect="excel", delimiter="\t")
reader2=csv.reader(fhand2, dialect="excel", delimiter="\t")
#empty list for appending data into
#appending into this will create a 2d list, or "a list OF lists"
mylist=list()
mylist2=list()
mydict=dict()
myset=set()
newset=set()
#filters data by iterating over each row in the reader object
#note that this IGNORES headers. This will need to be appended later
for row in reader:
if row[1]=="7/1/2000" or row[1]=="7/1/2010":
#plug columns into specific variables, for easier coding
#replaces "," with empty space for columns that need to be converted to floats
name=row[0]
date=row[1]
pop=row[9].replace(",",'')
mobile=row[4].replace(",",'')
health=row[6]
internet=row[5]
gdp=row[19].replace(",",'')
#only appends rows that have COMPLETE rows of data
if name != '' and date != '' and pop != '' and mobile != '' and health != '' and internet != '' and gdp != '':
#declare calculated variables
mobcap=(float(mobile)/float(pop))
gdplog=log(float(gdp))
healthlog=log(float(health))
#re-declare variables as strings, rounds decimal points to 5th place
#this could have been done once in above step, merely re-coded here for easier reading
mobcap=str(round(mobcap, 5))
gdplog=str(round(gdplog, 5))
healthlog=str(round(healthlog,5))
#put all columns into 2d list (list of lists)
newrow=[name, date, pop, mobile, health, internet, gdp, mobcap, gdplog, healthlog]
mylist.append(newrow)
myset.add(name)
for row in reader2:
mydict[row[2]]=row[0]
我现在需要做的是 1.从mylist变量中读取国家/地区名称, 2.在mydict的键值中查找该字符串,并且 3.将该键的值附加回mylist。
我完全不知道如何做到这一点。
我应该制作两个数据结构字典吗?我仍然不知道如何执行上述步骤。
感谢您的任何见解。
答案 0 :(得分:0)
这取决于你的意思是“将该键的值附加回mylist”。你的意思是,将我们从mydict获得的值附加到包含我们用来查找它的国家名称的列表中吗?或者你的意思是将mydict中的值附加到mylist本身吗?
后者将是一件奇怪的事情,因为mylist是一个列表列表,而我们所讨论的值(“row [0]”)是一个字符串。我不能直觉为什么我们会将一些字符串附加到列表列表中,即使这是您的描述所要做的。所以我假设前者:)
我们假设你的mylist实际上被称为“指标”,而mydict被称为“region_info”
for indicator in indicators:
try:
indicator.append(region_info[indicator[0]])
except:
print "there is no region info for country name %s" % indicator[0]
关于可读性的另一个评论。我认为mylist的元素会比列表更好。我会这样做:
newrow={"country_name" : name,
"date": date,
"population": pop,
#... etc
因为当你使用这些东西时,你可以按名称而不是数字使用它们,这将更具可读性:
for indicator in indicators:
try:
indicator["region_info"] = region_info[indicator["country_name"]]
except:
print "there is no region info for country name %s" % indicator["country_name"]