2

私はプログラムを書こうとしていますが、それで多くの問題を抱えています。手順は次のとおりです。このプログラムでは、いくつかの米国国勢調査データから単純なデータベースを作成します。データベースは、キーが州名で、値が 1900 年から 1990 年までの各年の人口のリストである辞書で構成されます。データベースを作成したら、プロンプトを表示する簡単なコマンド駆動型プログラムを作成します。州名と年のユーザーを作成し、その州のその年の人口を報告します。プログラムは、ユーザーが「q」または「Q」で始まる単語を入力するまでこれを行います。

国勢調査データはこちら: http://www.census.gov/population/www/censusdata/files/urpop0090.txt すべてを「データベース」という名前のフラット ASCII ファイルに保存しました。

時間をかけてファイルを調べてください。余分な情報が含まれています(少なくとも私たちの目的のために)。ファイルから必要な情報を正確に抽出してデータベース (辞書) に入れるための戦略を立てる必要があります。

必要な情報を説明するための私のパターンは次のとおりです。

  1. 行が 6 つのスペースで始まり、その後に大文字が続く場合、状態データを含む行があることがわかります。その行の後ろに 2 つのスペースが連続してある場合、州名の末尾を見つけることができます。

  2. 州データを含む行がある場合、その行の最初の総人口を見つけるには、文字 43 に移動し、1 つのスペースが見つかるまで戻ってください。

  3. 州データを含む行がある場合、文字 101 に移動し、1 つのスペースが見つかるまで戻ると、その行の 2 番目の総人口を見つけることができます。

  4. 州データを含む行がある場合、文字 159 に移動し、1 つのスペースが見つかるまで戻ると、その行の 3 番目の総人口を見つけることができます。

これは私がこれまでに持っているものです:

#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

キー/値を持つディクショナリを実際に作成する方法と、人口値を州名のキーに固定する方法を理解するのに苦労しています。また、ユーザー入力を取得してそれをキーとして使用する方法にも自信がありません。そこにあるコードが州名と人口の情報を適切に取得するかどうかもわかりません。

任意の提案/ヘルプをいただければ幸いです!

4

3 に答える 3

1

dict を作成するには、次のようにします。

censusvalues = {}
censusvalues['CA'] = {}
censusvalues['CA']['1960'] = <1960 census value>

抽出したデータに基づいて、そのような辞書を作成できます。

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 年ではなく 1 年しか存在しない場合に何が起こるかを説明する必要があります。これは練習問題として残しておきます...

編集: もう 1 つ、K/V ペアを追加する前に dict の存在を確認する必要もあります...おそらく次のように:

if not <state> in censusvalues:
    censusvalues[<state>] = {}
于 2014-03-06T21:24:34.703 に答える
0

与えられた: 1 億人を超える州がないため、人口 1 は文字 34 から始まることがわかっています。母集団 1 は文字 44 で終わることがわかっています。

ただし、人口が 1,000 万人未満の州もあるため、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 については、状態情報のインデックスを変更し、上記と同じロジックを使用するだけです。

これはすべて 1 行で実行できます。

 def get_population_one(line):
     return int(line[34:44].replace(',', '').strip())
于 2014-03-06T22:24:38.017 に答える
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、キーが int または文字列 (この場合は文字列) であり、値がほぼすべてのデータ構造 (リスト、int、文字列、int のリスト、さらに別の dict) である場合です。 、または辞書のリスト..あなたは写真を手に入れます)

于 2014-03-06T21:27:15.043 に答える