在我编写的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个整数元素列表?
提前感谢您对此的理解。
答案 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