我正在尝试编写一个程序,但我遇到了很多麻烦。以下是我的指示: 对于此程序,您将从一些美国人口普查数据创建一个简单的数据库。数据库将包含一个字典,其字符是状态名称,其值是1900年至1990年每年的人口列表。一旦创建了数据库,您将编写一个简单的命令驱动程序,它将提示一个州名和一年的用户,然后报告该州的那一年的人口。您的程序将执行此操作,直到用户键入以“q”或“Q”开头的任何单词。
人口普查数据在这里:http://www.census.gov/population/www/censusdata/files/urpop0090.txt 我已将所有保存到名为“database”的平面ascii文件
花一些时间研究这个文件。它包含一些多余的信息(至少为我们的目的)。您需要制定一个策略,从文件中精确提取您需要的信息以放入数据库(字典)。
以下是我描述所需信息的模式:
您可以告诉您线路上有状态数据 以6个空格开头,后跟一个大写字母。您可以 当稍后连续有两个空格时,找到状态名称的结尾 在那一行。
如果您的行包含州数据,则可以找到第一行 通过转到角色43然后备份该行上的总人口 直到找到一个空格。
如果您有一行包含州数据,您可以找到第二行 通过转到字符101然后备份,该行上的总人口 直到找到一个空格。
如果您的行包含州数据,则可以找到第三行 通过转到字符159然后备份该行上的总人口 直到找到一个空格。
这是我到目前为止所做的:
#gets rid of commas in the populations
def convert_string_to_number( comma_string ):
number = comma_string.replace(",","")
parts = number.split(".") # check for a decimal point
if len(parts) == 1 and parts[0].isdigit(): # we really have an integer
number = float(parts[0])
elif len(parts) == 2 and parts[0].isdigit() and parts[1].isdigit(): #float
number = float (parts[0] + "." + parts[1])
else:
number = None
return number
def getsub(str, endindex):
sublist = str[:endindex].split(' ')
substring = sublist[-1]
return substring
def main():
data = open('database', 'r')
lines = data.readlines()
for line in lines:
# Now do the line processing.
if line.startswith(' '):
# Now process the state data
firsttotalpop = getsub(line, 42)
secondtotalpop = getsub(line, 100)
thirdtotalpop = getsub(line, 158)
return 0
我在弄清楚如何使用键/值实际创建字典时遇到了一些麻烦,以及如何让人口值坚持使用状态名称的键。另外,我不肯定如何获取用户输入并将其用作密钥。我也不确定那里的代码是否正确获取州名和人口信息。
非常感谢任何建议/帮助!
答案 0 :(得分:1)
要创建一个词典,你可以这样做:
censusvalues = {}
censusvalues['CA'] = {}
censusvalues['CA']['1960'] = <1960 census value>
你可以根据你提取的数据填充dict:
censusvalues['CA'] = {}
censusvalues['CA']['1960'] = 456
censusvalues['CA']['1970'] = 789
>>censusvalues
>>{'CA': {'1960': 456, '1970': 789}}
提示符将提示用户输入州名和年份:
state = raw_input("Enter the state: ")
year = raw_input("Enter the year: ")
然后会做类似的事情:
censusvalues[name][year]
打印输出。
我将在这里解决我在代码中看到的一些问题(确保在这些编辑后的开头导入re):
def main():
data = open('database', 'r')
lines = data.readlines()
year = 0
censusvalues = {}
for line in lines:
# Now do the line processing.
# The first thing you need to do here is see which years
# you are about to grab data from. To do this, you need to figure out
# how to extract that from the file. Every line that has a year in it is prefixed by the same number of spaces followed by a number, so you can get it that way:
if re.match('<insert number of spaces here...too lazy to count>[0-9]', line):
year = int(line[<number of spaces>:].strip())
continue
if line.startswith(' '):
# Now process the state data
<you need to insert code here to grab the state name>
firsttotalpop = getsub(line, 42)
secondtotalpop = getsub(line, 100)
thirdtotalpop = getsub(line, 158)
censusvalues[state][year] = firsttoalpop
censusvalues[state][year-10] = secondtotalpop
censusvalues[state][year-20] = thirdtotalpop
return 0
最后,你需要说明当你只有一年在一行而不是3年时会发生什么。我会把它作为你的练习...
编辑:还有一件事,你还需要在尝试添加K / V对之前检查dict是否存在......就像这样:
if not <state> in censusvalues:
censusvalues[<state>] = {}
答案 1 :(得分:0)
至于创建字典:
my_dict = {}
my_dict['Texas'] = [1,2,5,10,2000] #etc etc
my_dict['Florida'] = [2,3,6 10, 1000] #etc etc
你也可以这样做,
temp = 'Florida'
print my_dict[temp]
您可以根据需要存储数据,但一般语法是
dict[key] = value
其中key可以是int或string(在你的情况下是字符串),value可以是几乎任何数据结构(list,int,string,int列表,甚至是另一个dict或dicts列表..你得到的照片)
答案 2 :(得分:0)
鉴于:我们知道人口1从角色34开始,因为没有超过1亿人的州。我们知道人口1将以44字符结束。
然而,有些州的人数不足一千万,所以他们必须从第35或36号角度开始。这有关系吗?否。
# where line is the line is containing STATE information
def get_population_one( line ):
populationOne = line[34:44]
populationOne = populationOne.replace(',','') # remove the commas
populationOne = populationOne.replace(' ', '') # remove any spaces for states that start with less than 10 million population
return int(populationOne) # convert the string to an integer
然后对于人口2和人口3,你必须只改变状态信息的索引并使用上面相同的逻辑。
这一切都可以在一行中完成:
def get_population_one(line):
return int(line[34:44].replace(',', '').strip())