根据for循环返回的值将键值对附加到字典中

时间:2015-03-07 23:14:06

标签: python dictionary

我正在尝试将包含医疗记录列表的文件组织成与每条记录相关的值集。我已将它们分开,现在正尝试将它们组织成一个字典,其中包含记录唯一ID和每条记录的返回值。我有点卡在最后,但背景列在下面。

下面这个函数将多个记录的文件分成单个记录:

def recordList(file_path):
    with open(file_path) as f:
        chunk = []
        for line in f:
            if 'FIRST_WORD' in line:
                if chunk:
                    yield "".join(chunk)
                chunk = [line]
            else:
                chunk.append(line) 
        if chunk:
            yield "".join(chunk)

xx = recList(file_name)    #CAN'T print xx since its a generator fun
yy = list(xx)  #CAN print yy and view all the records, or check indiv records
                  e.g. print yy[4] prints out the 4th record 

然后我在每条记录中创建一个感兴趣的值字典,以及一个在记录中查找这些值并返回它们的函数:

pdict= {}

pdict = {
"ID": r"(ID: )(reg expression for ID number)",
"Name": r"(NAME:)([A-Z]{0,20}\s{0,3}[A-Z]{0,20})(\s+SPC)"
"Date": r"(DATE DRAWN:\s)(\d..\d\d.\d\d)"
"Key1": r"(Key1: )(reg expression for key1 value)",
"Key2": r"(Key2: )(reg expression for key2 value)",
}


#Function that searches for patterns above within a record

def paramGetter(pattern, record): 
seeker = re.search(pattern, record)
if seeker:
    return (seeker.group(2))
else:
    return None

作为最后的任务,我正在创建一个包含所有记录和返回值的新字典。密钥将是每个记录的ID号+日期(唯一标识符组合),并且值将是每个记录的所有提取参数(上面的rec_params)。以下适用于单个记录,此处为#20,并执行该任务。但是,我不确定如何让它遍历整个文件并将这些词典附加到主词典中。我尝试用str(yy)代替yy [20],但收到了错误信息。任何帮助将不胜感激!

rec_params = {} 
masterDict = {}

for record in yy:
    for key in pdict.keys():
        res =  paramGetter(pdict[key], yy[20])
        if res:
            rec_params[key] = res
    UNIQUE_ID = str(rec_params['ID'] + "-" + rec_params['Date'])
    masterDict = {UNIQUE_ID: rec_params}  

2 个答案:

答案 0 :(得分:0)

这里有很多代码,但我们来看看:

masterDict = {}                                                                 # 1
                                                                                # 2
for record in recList(file_path):                                               # 3
    for key in pdict.keys():                                                    # 4
        res =  paramGetter(pdict[key], record)                                  # 5
        if res:                                                                 # 6
            rec_params[key] = res                                               # 7
        for key in masterDict.keys():                                           # 8
            masterDict[key]= str(rec_params["ID"] + "-" + rec_params["Date"])   # 9
        for value in masterDict.values():                                       # 10
            masterDict[value]= rec_params                                       # 11

您(尝试)插入masterDict的唯一部分是第9行和第11行。

但由于masterDict为空,你永远不会到第9行或第11行(因为你永远不会在第8行和第10行输入for循环的主体 - 因为{{1是空的。目前它是一个“鸡或蛋”型问题。

也许您想要在第3行之前使用某些默认值初始化masterDict,或者在第8行和第10行上迭代其他内容。

答案 1 :(得分:0)

我看不到你定义rec_params的任何显而易见的地方,这意味着如果我们在第7行输入条件(根据jedward的有用行号),我们应该点击NameError。因此,打印分配给res的结果,以确认它的行为符合预期。 如果事实上你已经在某处定义了它,那么请尝试以下方法,看看你是如何进行的:

masterDict = {}

for record in recList(file_path):
    for key in pdict.keys():
        res =  paramGetter(pdict[key], record)
        if res:
            rec_params[key] = res 
            master_key = str(rec_params["ID"] + "-" + rec_params["Date"])
            masterDict[master_key] = rec_params

在嵌套for循环中分配key两次可能不是一个好主意。

相关问题