簡體   English   中英

將csv中的字符串解析為字典

[英]Parsing string in csv into 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']
}

任何幫助表示贊賞。 謝謝

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 

我知道這個問題已經有了一個公認的答案,但我想與你分享另一種使用字典理解和lambdas的方法。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM