1

私が書いているPythonプログラムでは、キーとして年の値を持ち、値として12か月の観測値のリストを持つ連想配列(辞書)を使用します。たとえば、データを辞書に読み込んだ後、次のような辞書が作成される可能性があります(12個の値の3つのリストを指す3つのキー)。

{ 1953:[34,39,29,12,16,14,35,42,44,31,22,29],
  1954:[30,31,32,11,19,22,31,41,34,37,25,22],
  1955:[35,36,37,15,19,25,30,45,38,39,21,26] }

辞書にデータを読み込むたびに、キーと値のペアの数が異なる場合があります。ファイルからデータを読み取るループの各反復の開始時に空の辞書から始めたいと思います(簡単にするために、13個の値のコンマ区切りのリストであると仮定します。最初の値は年で、その後に12個の月次観測値が続きます。 )。私はPythonを初めて使用するので、Pythonでこの種のことを行うためのベストプラクティスを学びたいと思います。Javaでは、次のようにします。

for (int i = 0; i < 3; i++)
{
    Map<String, List<String>> yearToObservationsMap= new HashMap<String, List<String>>();
    String line = bufferedReader.readLine();
    while (line != null)
    {
        line = bufferedReader.readLine();
        List<String> yearPlusObservations = line.split(",");
        String year = yearPlusObservations.remove(0); 
        yearToObservationsMap.put(year, yearPlusObservations);
    }

    // now I can work with the dictionary to process the data
}

私のユースケースは、使用するたびに辞書に可変数のエントリが必要になるため、ロードする前に毎回再初期化(または空?)したいというものです。たとえば、ある反復中に5年間のデータがあり、次の反復には30年間のデータがあり、次の反復には17年間のデータがあります。したがって、各反復で辞書をクリアしたいと思います。しかし、明確な形式を与える方法で辞書を宣言したいのでしょうか。つまり、年であるキーと常に整数の12要素リストである値を持つことが常に知られているのでしょうか。

これを理解するためにあなたの助けを事前に感謝します。

4

4 に答える 4

3

ファイルを開き、「、」で分割して、dict理解度に渡します。

with open('your_file') as fin:
    lookup = {row[0]:row[1:] for row in (line.split(',') for line in fin)}

または、CSVモジュールを使用します(そして正しく(私には咳をします)、intに変換します)

with open('test.csv') as fin:
    csvin = csv.reader(fin)
    lookup = {col[0]:col[1:] for col in (map(int, row) for row in csvin)}
于 2012-11-01T15:59:06.833 に答える
2

このようなもの:

In [4]: with open("data1.txt") as f:
    dic={}
    for line in f:
        spl=line.split(",")
        dic[spl[0]]=map(int,spl[1:]) 
    print dic
   ...:     
   ...:     
{'1955': [35, 36, 37, 15, 19, 25, 30, 45, 38, 39, 21, 26],
 '1954': [30, 31, 32, 11, 19, 22, 31, 41, 34, 37, 25, 22],
 '1953': [34, 39, 29, 12, 16, 14, 35, 42, 44, 31, 22, 29]}
于 2012-11-01T16:00:12.337 に答える
2

私はあなたの質問に逆に答えます。あなたが尋ねる:

しかし、明確な形式を与える方法で辞書を宣言したいのでしょうか。つまり、年であるキーと常に整数の12要素リストである値を持つことが常に知られているのでしょうか。

この質問への答えはノーです。Pythonは動的に型付けされるため、Javaで必要な種類の型注釈は不要です。さらに、ディクショナリには、(不変の)オブジェクトの異種コレクションをキーとして含めたり、文字列と整数を混合したりすることができ、文字通りすべてのオブジェクトを値として含めることができます。

辞書を再初期化する限り、毎回新しい辞書を作成することができます。しかし.clear()、辞書を空にする方法もあります。何らかの理由で毎回新しい辞書を作成したくない場合は、を使用して.clear()ください。

これを行う方法の詳細は他の回答で見ることができますが、私はあなたの実際の質問と思われるものにもっと直接的に対処したいと思いました。

于 2012-11-01T16:21:02.487 に答える
1

これが基本的なロジックです

answer = {}
with open('path/to/input') as f:
    for line in f:
        line = [int(i) for i in line.strip().split(',')]
        answer[line[0]] = line[1:]

複数のファイルを処理する場合は、各ファイルに異なる年数のデータが含まれています。次に、これを関数にラップします。

def getData(infilepath):
    answer = {}
    with open(infilepath) as f:
        for line in f:
            line = [int(i) for i in line.strip().split(',')]
            answer[line[0]] = line[1:]
    return answer
于 2012-11-01T15:58:33.747 に答える