0

我正在编写一个程序,它从文件中读取与这些名称相关的名称和统计信息。文件的每一行都是另一个人和他们的统计数据。对于每个人,我想让他们的姓氏成为一个键,以及字典中与该键相关的所有其他内容。该程序首先将文件中的数据存储在一个数组中,然后我试图将这些数组元素放入字典中,但我不知道该怎么做。另外,我不确定每次 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']

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

4

2 回答 2

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模块负责拆分和删除换行符。

语法错误源于尝试{用 a)而不是关闭开口}

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

如果您需要为每个row[2]值收集多个条目,请将它们收集在一个列表中;一个collections.defaultdict实例使这更容易:

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])
于 2013-11-03T00:24:49.657 回答
0

作为对上述 Generalkidd 评论的回应,多个具有相同上次时间的人,作为 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])
于 2013-11-03T00:52:10.933 回答