将来自csv文件的输入附加到字典,包括唯一键的重复值

时间:2014-02-03 03:44:53

标签: python-2.7 dictionary

首先,我想说我是编程新手。也就是说,使用Python 2.76,我试图获取一个文本文件,用csv读取它,然后用一个等于文件中第一列的键创建一个字典。下面是我想要使用的文件类型的示例(抱歉格式错误,有三列,每列都有一个给定值的visitid,date或time):

  

visitid cdate ctime

     

OMHioJh8XEeq7152 6/15/2007 06:00

     

OMHioJh8XEeq7152 6/14/2007 07:10

     

OMHioJh8XEeq7152 6/11/2007 14:21

     

t2v0TjgroLTI6118 4/28/2006 14:18

     

t2v0TjgroLTI6118 5/1/2006 04:00

具体来说,鉴于这种列表,我想在字典中创建一个等于第一列值的键,并且该值将剩余列作为列表。最后,如果第1列中的值重复以形成列表列表,我想将该值附加到另一个列表中,可以这么说。这是我到目前为止在这里和其他地方进行一些研究后所做的事情:

def test_results(filename):
import csv
with open(filename,"rU") as f:
    reader = csv.reader(f,delimiter="\t")
    result = {}
    for row in reader:
        key = row[0]
        if key in result:
            result[row[0]].append(row[1])
        else:
            result[row[0]] = key
        result[key]=row[1:]
    print result

这样可行,但它不会附加值来创建列表列表,只会将字典添加到任何唯一visitID的最后一行。

谢谢!

2 个答案:

答案 0 :(得分:1)

也许是这样的:

    if key in result:
        result[row[0]].append(row[1:])
    else:
        result[row[0]] = key
        result[key] = [row[1:]]

答案 1 :(得分:1)

您应该使用defaultdict

from collections import defaultdict
import csv

def test_results(filename):
    with open(filename, "rU") as f:
        reader = csv.reader(f, delimiter="\t")
        result = defaultdict(list)
        # Skip header row
        next(reader)
        for row in reader:
            result[row[0]].append(row[1:])
如果字典中没有键,

defaultdict(list)将假定一个空列表。如果问题中提供了输入,result将包含:

{'OMHioJh8XEeq7152': [['6/15/2007', '06:00'],
                      ['6/14/2007', '07:10'],
                      ['6/11/2007', '14:21']],
 't2v0TjgroLTI6118': [['4/28/2006', '14:18'], 
                      ['5/1/2006', '04:00']]}

如果您想要更灵活的格式,则应使用datetime将日期和时间字符串转换为dateutil.parser.parse对象:

import csv
from collections import defaultdict
from dateutil import parser


def test_results(filename):
    with open(filename, "rU") as f:
        reader = csv.reader(f, delimiter="\t")
        result = defaultdict(list)
        # Skip header line
        next(reader)
        for row in reader:
            result[row[0]].append(parser.parse(' '.join(row[1:])))

哪个收益率:

{'OMHioJh8XEeq7152': [datetime.datetime(2007, 6, 15, 6, 0),
                      datetime.datetime(2007, 6, 14, 7, 10),
                      datetime.datetime(2007, 6, 11, 14, 21)],
 't2v0TjgroLTI6118': [datetime.datetime(2006, 4, 28, 14, 18),
                      datetime.datetime(2006, 5, 1, 4, 0)]}