在Python中,您如何初始化/重新初始化关联阵列(字典)



在我写的python程序中,我将使用一个关联数组(字典),该数组将年度值作为键和12个每月观察值的列表作为值。例如,在将我的数据读取到字典中后,我可能最终会出现一个看起来像这样的字典(3个键指向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个值的逗号分隔列表,其中第一个是一年,然后是十二个月度观察值)。我是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个元素列表的钥匙?

事先感谢您在理解这一点方面的帮助。

只需打开文件,用''拆分,然后将其传递给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)}

我会反向回答您的问题。你问:

但是,我还想以一种确定的形式来宣布字典,即始终知道它的键是始终是12个整数元素列表的年份和值?

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

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

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

类似的东西:

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]}

这是基本逻辑

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

最新更新