如何从csv fi中的重复数字中生成一个值的字典

2024-10-03 00:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,想为我的csv文件创建一个字典。我的数据格式如下:

c1     c2     p    trade
GER   USA     1     100
GER   ITA     1     80
JPN   ITA     2     120
USA   GBR     1     70
DNK   CAN     2     100
USA   DNK     2     70
DNK   GER     1     40
FRA   GER     4     50
USA   GER     6     80

我打算创建一个字典,它的键是国家(c1和c2),值是产品(p)。像这样:

dic_c1c2_products={"GER": 1, 4,6 "USA":1,2,6 "ITA": 1,2, "JPN": 2 "GBR":1, DNK:"2,1 "CAN":2 "FRA:4} 

我已经编写了以下代码,但无法正常工作:

rfile = open('filepath','r')
dic_c1c2_products = {}
for i in rfile :
    lns = i.strip().split(',')
    c1 = lns[0]
    c2 = lns[1]
    p = lns[2]
    if not dic_c1c2_products.has_key(c1) and not dic_c1c2_products.has_key(c2):
         dic_c1c2_products[c1] = [p,]
         dic_c1c2_products[c2]=[p,]
    elif dic_c1c2_products.has_key(c1) and not dic_c1c2_products.has_key(c2):
         dic_c1c2_products[c2]=[p,]
         if p not in dic_c1c2_products[c1]:
              dic_c1c2_products[c1].append(p)
   elif not dic_c1c2_products.has_key(c1) and dic_c1c2_products.has_key(c2):
         dic_c1c2_products[c1] = [p,]
         if p not in dic_c1c2_products[c2]:
             dic_c1c2_products[c2].append(p)
    elif dic_c1c2_products.has_key(c1) and dic_c1c2_products.has_key(c2):
         if p not in dic_c1c2_products[c2] and dic_c1c2_products[c1]:
             dic_c1c2_products[c1].append(p)
             dic_c1c2_products[c2].append(p)

任何帮助都将不胜感激。你知道吗


Tags: andkeyinifnotproductshasc2
2条回答

我会使用这里的^{} module来读取格式,而不是手动拆分。你知道吗

将值收集到集合对象中,以便只获得唯一的值:

import csv

with open('filepath', 'rb') as infile:
    reader = csv.reader(infile)
    dic_c1c2_products = {}

    for c1, c2, p, trade in reader:
        dic_c1c2_products.setdefault(c1, set()).add(int(p))
        dic_c1c2_products.setdefault(c2, set()).add(int(p))

如果字典中没有键(c1c2),则dict.setdefault()调用插入一个空的set()对象。你知道吗

演示:

>>> import csv
>>> sample = '''\
... GER,USA,1,100
... GER,ITA,1,80
... JPN,ITA,2,120
... USA,GBR,1,70
... DNK,CAN,2,100
... USA,DNK,2,70
... DNK,GER,1,40
... FRA,GER,4,50
... USA,GER,6,80
... '''.splitlines()
>>> reader = csv.reader(sample)
>>> dic_c1c2_products = {}
>>> for c1, c2, p, trade in reader:
...     dic_c1c2_products.setdefault(c1, set()).add(int(p))
...     dic_c1c2_products.setdefault(c2, set()).add(int(p))
... 
>>> dic_c1c2_products
{'GER': set([1, 4, 6]), 'FRA': set([4]), 'USA': set([1, 2, 6]), 'JPN': set([2]), 'DNK': set([1, 2]), 'ITA': set([1, 2]), 'GBR': set([1]), 'CAN': set([2])}
>>> from pprint import pprint
>>> pprint(_)
{'CAN': set([2]),
 'DNK': set([1, 2]),
 'FRA': set([4]),
 'GBR': set([1]),
 'GER': set([1, 4, 6]),
 'ITA': set([1, 2]),
 'JPN': set([2]),
 'USA': set([1, 2, 6])}

您可以使用collections.defaultdict

import csv
from collections import defaultdict
d= defaultdict(set)

with open('eggs.csv', 'rb') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=',')
     for row in spamreader:
          i,j,k=row[:3]
          d[i].add(k)
          d[j].add(k)

您只需创建一个defaultdict,其中set对象作为其值,然后在行上循环,插入1st和2nd作为键,并将第3个元素添加到set value。你知道吗

相关问题 更多 >