如何在循环中创建向字典添加新项目?

时间:2013-11-03 00:22:39

标签: python arrays dictionary

我正在编写一个程序,从文件中读取与这些名称相关的名称和统计信息。该文件的每一行都是另一个人及其统计数据。对于每个人,我想将他们的姓氏作为密钥,并将其他所有内容与字典中的密钥相关联。程序首先将文件中的数据存储在一个数组中,然后我试图将这些数组元素放入字典中,但我不知道该怎么做。另外,我不确定每次for循环迭代时,它都会覆盖字典的先前内容。这是我用来尝试这个的代码:

f = open("people.in", "r")

tmp = None
people

l = f.readline()
while l:
        tmp  = l.split(',')
        print tmp
        people = {tmp[2] : tmp[0])
        l = f.readline()

people['Smith']

我目前得到的错误是语法不正确,但是我不知道如何将数组元素传输到字典中而不是像这样。

2 个答案:

答案 0 :(得分:3)

使用键分配:

people = {}

for line in f:
    tmp = l.rstrip('\n').split(',')
    people[tmp[2]] = tmp[0]

这会直接遍历文件对象,不需要.readline()次调用,并删除换行符。

您似乎有CSV数据;你也可以在这里使用csv模块:

import csv

people = {}

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    for row in reader:
        people[row[2]] = row[0]

甚至是字典理解:

import csv

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    people = {r[2]: r[0] for r in reader}

此处csv模块负责拆分和删除换行符。

语法错误源于尝试使用{代替)关闭开头}

people = {tmp[2] : tmp[0])  # should be }

如果您需要按row[2]值收集多个条目,请在列表中收集这些条目; collections.defaultdict instance使这更容易:

import csv
from collections import defaultdict

people = defaultdict(list)

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    for row in reader:
        people[row[2]].append(row[0])

答案 1 :(得分:0)

在回应基德将军的上述评论时,多个上次同样的人,Martijn Pieter解决方案的补充,作为更好格式化的答案发布:

import csv

people = {}

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    for row in reader:
        if not row[2] in people:
            people[row[2]] = list()
        people[row[2]].append(row[0])