查找值并添加到数据结构

时间:2014-01-17 23:20:47

标签: python python-2.7 csv

我有一个.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。

我完全不知道如何做到这一点。

我应该制作两个数据结构字典吗?我仍然不知道如何执行上述步骤。

感谢您的任何见解。

1 个答案:

答案 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"]