1

在我正在编写的 Python 程序中,我将使用一个关联数组(字典),它将年份值作为键,并将 12 个月观察的列表作为值。例如,在将我的数据读入字典后,我可能会得到一个看起来像这样的字典(3 个键指向 3 个包含 12 个值的列表):

{ 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

我会反过来回答你的问题。你问:

但是我是否也想以一种给它一个明确的形式的方式声明字典,也就是说,总是知道它的键是年份,值总是12个整数的元素列表?

这个问题的答案是否定的。Python 是动态类型的,因此省去了 Java 中必需的类型注释。此外,字典可以包含(不可变)对象的异构集合作为键,将字符串与整数混合等等,并且可以包含任何对象作为值。

至于重新初始化字典,您每次都可以创建一个新字典。但也有.clear()一种方法可以清空字典。如果您不想每次都创建新字典,无论出于何种原因,请使用.clear().

您可以在其他答案中查看有关如何执行此操作的详细信息,但我想我会更直接地解决您的实际问题。

于 2012-11-01T16:21:02.487 回答
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 回答
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 回答