首页 > 解决方案 > 如何创建将重复值映射到多个键和清理数据的字典?

问题描述

我是编程新手,正在尝试编写代码以使简单的任务更容易。所以现在我在使用 csv 文件时遇到了问题,该文件列出了数据库字段和与该字段关联的表。我想要的最终状态是一个字典,它成功地映射出每个出现字段的表。例如:{firstname;[cust_table,supplier_table,dealer_table]} 在某些项目中有很多不必要的空白. 我一直遇到的一个问题是,一些数据库字段被赋予了额外的空白,而另一些则没有,例如:'CUSTID'、'CUSTID'。我能做些什么来摆脱这个,同时仍然保持 db 字段和表之间的关系?

我尝试在 csv 模块中使用 reader 对象,并且能够创建我需要的所有字段的干净列表并删除所有重复项。我希望能够遍历此列表并将其用作我将创建的新字典的过滤器;将表的值添加到每个唯一的数据库字段(键)。但现在我没有返回任何东西(空字典)

import csv

f=open("Data Mapping Information.csv","r")

reader=csv.reader(f)

field_list=[]
for row in reader:
    field_list.append(row[1])

mylist=list(dict.fromkeys(field_list))

cleanList=[]
for item in mylist:
    clean_item=item.strip()
    cleanList.append(clean_item)

reader2=csv.reader(f)

mapping={}

for row in reader2:
    if row[1] in mylist:
        mapping[row[1]]=row[0]

以下是 csv 文件中一些行的示例:

ADS,CUSTID             
ADS,ROLEID         
ADS_PARTY,CUSTID     
CUST_TABLE,CUSTID

CUST_TABLE,FULLNAME

DEALER_TABLE,FULLNAME         

SUPPLIER_TABLE,FULLNAME

SUPPLIER_TABLE,ROLEID

标签: pythoncsvdictionarydata-cleaning

解决方案


我不确定这是你需要的。

import csv
from pprint import pprint

f=open("f0.csv","r")

reader=csv.reader(f)

d = {}

for row in reader:
    row[0] = row[0].strip() # remove leading, trailing whitespace
    row[1] = row[1].strip()

    d.setdefault(row[1], []).append(row[0])

f.close()

pprint(d)

印刷:

{'CUSTID': ['ADS', 'ADS_PARTY', 'CUST_TABLE'],
 'FULLNAME': ['CUST_TABLE', 'DEALER_TABLE', 'SUPPLIER_TABLE'],
 'ROLEID': ['ADS', 'SUPPLIER_TABLE']}

编辑:d.setdefault(row[1], []).append(row[0])是简写:

if row[1] not in d:
    d[row[1]] = []

d[row[1]].append(row[0])

推荐阅读