[英]Adding multiple dictionaries to a key in python dictionary
我试图将多个词典添加到一个键。 例如
value = { column1 : {entry1 : val1}
{entry2 : val2}
column2 : {entry3 : val3}
{entry4 : val4}
}
我到底要用此代码执行的操作是:有一个file.txt,其中包含该标题的列和有效条目。 我正在尝试创建一个以列为键的字典,每列为每个有效条目添加另一本字典。 所以我逐行解析文本文件以查找列和条目的模式并将其存储在变量中,检查字典中是否已存在该列(这是一个键),如果存在则将另一个字典添加到该列中,如果不创建一个新条目。 我希望这是有道理的。
file.txt的样本内容
blah blah Column1 blah blah
entry1 val1
entry2 val2
blah blah Column2 blah blah
entry3 val3
entry4 val4
我的代码:
from __future__ import unicode_literals
import os, re, string, gzip, fnmatch, io
from array import *
header = re.compile(...) #some regex
valid_entries = re.compile(---) #some regex
matches=[]
entries=[]
value = {'MONTH OF INTERVIEW' : {'01': 'MIN VALUE'}}
counter = 0
name = ''
f =open(r'C:/file.txt')
def exists(data, name):
for key in data.keys():
if key == name :
print "existing key : " + name
return True
else :
return False
for line in f:
col = ''
ent = ''
line = re.sub(ur'\u2013', '-', line)
line = re.sub(ur'\u2026', '_', line)
m = header.match(line)
v = valid_entries.match(line)
if m:
name= ''
matches.append(m.groups())
_,_, name,_,_= m.groups()
#print "name : " + name
if v:
entries.append(v.groups())
ent,col= v.groups()
#print v.groups()
#print "col :" + col
#print "ent :" + ent
if (name is not None) and (ent is not None) and (col is not None):
print value
if exists(value, name):
print 'inside existing loop'
value[name].update({ent:col})
else:
value.update({name:{ent:col}})
print value
我是python的新手,所以这可能是处理这种情况的幼稚方法。 如果您认为有一种更好的方式来获取我想要的东西,那么如果您告诉我,我将不胜感激。
字典每个键只有一个值。 诀窍是也使该值成为容器,例如列表:
value = {
'column1': [{entry1 : val1}, {entry2 : val2}]
'column2': [{entry3 : val3}, {entry4 : val4}]
}
如果尚无值,请使用dict.setdefault()
插入列表值:
if name is not None and ent is not None and col is not None:
value.setdefault(name, []).append({ent: col})
你可以只作一个值字典有多个(ent, col)
键值对的位置:
if name is not None and ent is not None and col is not None:
value.setdefault(name, {})[ent] = col
您的exists()
函数使excel擅长的任务字典过于复杂; 使用in
来完成密钥测试:
if name in value:
就足够了。
我会将键保留为字典列表,因此您可以extend
或append
>>> d = {}
>>> d[1] = [{'a': 1}]
>>> d[1].append({'b':2})
>>> d
{1: [{'a': 1}, {'b': 2}]}
您可以为此使用defaultdict和regex ( 此处为演示 ):
with open('/path/to/file.txt', 'rU') as f: # read the contents from the file
lines = f.readlines()
import re
from collections import defaultdict
d = defaultdict(list) # dict with default value: []
lastKey = None
for line in lines:
m = re.search('Column\d',line) # search the current line for a key
if m: lastKey = m.group()
else:
m = re.search('(?<=entry\d ).*',line) # search the current line for a value
if m: d[lastKey].append(m.group()) # append the value
输出:
[('Column1', ['val1', 'val2']), ('Column2', ['val3', 'val4'])]
注意:当然,以上代码假定您的file.txt的格式与示例中相同。 对于实际的file.txt数据,您可能必须调整正则表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.