在Python中,如何初始化/重新初始化关联数组(字典)?

时间:2012-11-01 15:55:58

标签: python dictionary

在我编写的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 个答案:

答案 0 :(得分: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)}

答案 1 :(得分: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]}

答案 2 :(得分:2)

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

  

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

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

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

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

答案 3 :(得分: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