2012-11-01 162 views
1

在我正在编写的一个Python程序中,我将使用一个关联数组(字典),它将年度值作为键和12个月度观察列表作为值。例如读我的数据到字典后,我最终可能看起来像这样一本字典(3个键指向12个值的3名名单):在Python中,你如何初始化/重新初始化关联数组(字典)?

{ 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个元素的整数列表?

在此感谢您的理解。

回答

2

我会回答你的问题相反。你问:

但我是否也想声明字典的方式给它一个确定的形式,即它总是会被知道有钥匙是年和值总是12元素列表整数?

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

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

你可以看到有关的详细信息如何在其他答案中做到这一点,但我想我会更直接地解决看似是你的实际问题。

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 
+0

感谢这个明确的例子。没有什么比使用{}声明/初始化字典更方便了吗? –

+1

@JamesAdams'{}'是字典的字面语法,还有'dict()'是同样的东西(但可以将迭代作为参数并且有一些类方法等),但是yup - ' d = {}'初始化一个空字典... –

+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)} 
+0

很好测试一个人的代码 – SilentGhost

+0

谢谢。我并不担心上面的具体示例是否正确,因为我的用例实际上有点问题。我的问题更多的是围绕如何最好地初始化和重新初始化字典,并且你是否做了任何事情来为字典提供规定的结构(即“这个字典总是包含整数和值的整数十二元素列表” )?也许作为一个Python新手,我期望需要比所需更多的结构,而且我可以放松这种比我在编写Java代码时习惯的东西。 –

+0

@James Yup,你可以松一口气 - 这个想法是不用担心的 - 当你需要任何你想要的键作为键(只要它们可以被哈希)以及任何你想要的值... - 这个例子一次性从文件生成它,但你可以像其他人所建议的那样自由地做,并创建一个空字典,然后逐行分配或其他你想要的,当你想要... –

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