我是python中词典概念的新手。 我有一个包含多列的csv文件,我想创建一个字典,以便从第一列获取键,从第二列获取值,并为这两列的所有行创建一个键:值对。 代码如下:
if __name__=="__main__":
reader = csv.reader(open("file.csv", "rb"))
for rows in reader:
k = rows[0]
v = rows[1]
mydict = {k:v}
print (mydict)
问题:返回的输出仅用于前两列的“最后”或“最底部”行,即{'12654':'18790'}。我希望字典包含此格式的前两列的所有100行。怎么做?我可以在前两列的行号上运行一些循环吗...我不知道怎么做。
答案 0 :(得分:6)
if __name__=="__main__":
mydict = {}
reader = csv.reader(open("file.csv", "rb"))
for rows in reader:
k = rows[0]
v = rows[1]
mydict[k] = v
print mydict
下面:
mydict = {k:v}
你在每次迭代中都在制作新词典,之前的数据已经丢失了。
更新
你可以做这样的事情:
mydict = {}
L = [(1, 2), (2, 4), (1, 3), (3, 2), (3, 4)]
for el in L:
k, v = el
if not k in mydict:
mydict[k] = [v]
else:
mydict[k].append(v)
print mydict
>>>
{1: [2, 3], 2: [4], 3: [2, 4]}
这样,将存储相同密钥的每个值
您的代码将是:
if __name__=="__main__":
mydict = {}
reader = csv.reader(open("file.csv", "rb"))
for i, rows in enumerate(reader):
if i == 0: continue
k = rows[0]
v = rows[1]
if not k in mydict:
mydict[k] = [v]
else:
mydict[k].append(v)
print mydict
Update2:你的意思是?
for k, v in mydict.items():
print "%s: %s" % (k, v)
>>>
1: [2, 3]
2: [4]
3: [2, 4]
Update3:
这应该有效:
if __name__=="__main__":
mydict = {}
reader = csv.reader(open("file.csv", "rb"))
for i, rows in enumerate(reader):
if i == 0: continue
k = rows[0]
v = rows[1]
if not k in mydict:
mydict[k] = [v]
else:
mydict[k].append(v)
print mydict
答案 1 :(得分:5)
您正在创建一个新的dict并在每次迭代时覆盖旧的dict。 @develerx's answer解决了这个问题。我只想用dict理解来指出一种更简单的方法:
假设csv文件包含两列。
if __name__=="__main__":
reader = csv.reader(open("file.csv", "rb"))
my_dict = {k: v for k, v in reader}
print mydict
如果您使用的是旧版本(我认为超过2.7),则无法使用dict理解,只需使用dict函数:
my_dict = dict((k, v) for k, v in reader)
编辑:我只是想到了; my_dict = dict(reader)
也可以发挥作用。