将csv中的字符串解析为字典

时间:2019-04-22 15:32:03

标签: python csv dictionary

我有以下格式的csv文件

mod, id
128, 2pmk|5svq|3ar7|5xw6|5ncq|5a3s|2gvd|1i5d
574, 3zjt
0A, 4wb3|4wb2|4r8i
0C, 1r3o|4wb3|4wb2|2gq6|2gq4|2gq5|4r8i|2gpm|2g32|2gq7
0G, 1r3o|4wb3|4wb2|2gq6|2gq4|2gq5|4r8i|2gpm|2g32|2gq7
0U, 1r3o|4wb3|4wb2|2gq6|2gq4|2gq5|4r8i|2gpm|2g32|2gq7

我想将信息转换成键和值的字典,其中键将是ID的(来自单独的列表),而值将是ID中存在的所有mod。我写了以下我认为是错误的代码

import csv

id_list = ['1r3o', '4wb2', '1kmk']

n = {}

with open('test6.csv', mode='rU') as infile:
    reader = csv.reader(infile)
    for elem1 in id_list:
        for row in reader:
            identifier = row[1].split('|')
            for elem2 in identifier:
                while elem1 == elem2:
                    n[elem1] = row[0]

print n 

如果列表中的ID与mod之间没有映射,我希望将字符串“ None”附加到字典值中。所需的输出如下所示:

{
'4wb2': ['OA', 'OC', 'OG', 'OU'],
'1r3o': ['OC', 'OG', 'OU'],
'1kmk': ['None']
}

感谢您的帮助。谢谢

2 个答案:

答案 0 :(得分:0)

import csv

id_list = ['1r3o', '4wb2', '1kmk']

n = {}

mapping = {}
with open('test6.csv', mode='rU') as infile:
    reader = csv.reader(infile)
    for row in reader:
        mod, ids = row
        for id in ids.split('|'):
            if id not in mapping.keys():
                mapping[id] = set()
            mapping[id].add(mod)

for id in id_list:
    values = list(mapping.get(id, []))
    if not values:
        values = ['None']
    n[id] = values

print n 

答案 1 :(得分:0)

我知道这个问题已经有了一个可以接受的答案,但是我想与您分享使用字典理解和lambda的另一种方法。

import csv
id_list = ['1r3o', '4wb2', '1kmk', 'foo', 'bar', '3zjt']

# Read the content of the file
csv_content = []
with open('test6.csv', mode='rU') as file:
    for row in csv.reader(file):
        csv_content.append([row[0], row[1]])

# Collect the required data
mapped = { id: map(lambda f: f[0], filter(lambda r: id in r[1], csv_content)) for id in id_list }


# Add 'None' on empty results
results = dict(map(lambda item: (item[0], ['None'] if len(item[1]) == 0 else item[1]), mapped.iteritems()))

print(results)