首先,我想说我是编程新手。也就是说,使用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的最后一行。
谢谢!
答案 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)]}