Iterating Through Dictionary of Lists

JB jamesb7us at gmail.com
Mon Sep 14 19:48:08 CEST 2009


On Sep 11, 9:42 am, Stefan Behnel <stefan... at behnel.de> wrote:
> JBwrote:
> > I have created a small program that generates a project tree from a
> > dictionary. The dictionary is of key/value pairs where each key is a
> > directory, and each value is a list. The list have unique values
> > corresponding to the key, which is a directory where each value in the
> > list becomes a subdirectory.
>
> > The question that I have is how to do this process if one of the
> > unique values in the list is itself a dict. For example, in the
> > "projdir" dict below, suppose the "Analysis" value in the list
> > corresponding to the "Engineering" key was itself a dict and was
> > assigned {'Analysis' : 'Simulink'} for example.
>
> You might want to read up on recursion, i.e. a function calling itself.
>
> You can find out if something is a dict like this:
>
>         isinstance(x, dict)
>
> or, if you know it really is a dict and not a subtype:
>
>         type(x) is dict
>
> Stefan

Stefan;

Thanks for your valuable suggestion. I have employed your suggestion
with the code below.
I also converted this to object oriented design. With this type of
construction, the
program will easily handle the dictionary specified by the self.proj
variable. This
variable is a dictionary with some of the value variables also being
dictionaries.
I did not generalize the function call but have more of horizontal
code for this
area of the implementation. If this program were packaged with a GUI,
it would
make the beginning of a project management software platform.

-James



from time import strftime
import os

#-------------------------------------
# Print/Make Directories
#-------------------------------------
class Tree:
 def __init__(self,dir_main,dir_sub,sch_names,drawing_name):
	self.proj         =     {'Project'        :  ['Schedule',
'Specifications'],

            'Schematics_PCB' :  [{'SCH':sch_names},{'BOM':sch_names},
{'ASSY':sch_names},
                                 {'RELEASE':sch_names}],

            'Drawings'       :  [{'System':drawing_name},
{'Board':sch_names},
                                 'Packaging_3D'],

            'Engineering'    :  [{'Analysis':
['Simulink','Matlab','Excel',
                                              'MathCad','Python']},
                                 {'Eng Reports':sch_names}, {'Design
Reviews':sch_names},
                                 {'Procedures':['Board Test','System
Test']}]}
	self.sch_names    = sch_names
	self.drawing_name = drawing_name
	self.dir_main     = dir_main
	self.dir_sub      = dir_sub
	self.root         = self.dir_main + self.dir_sub
	self.pathname     = ''
	self.suffix       = "\\Previous \n"
	self.recursion    = 0.0
	self.zs           = ''

 def gen_dir(self):
	if os.path.exists(self.pathname):
		pass
	else:
		os.makedirs(self.pathname)
	return

 def print_path(self):
	print self.pathname
	Tree.gen_dir(self)

	self.zs = self.pathname + self.suffix

	Tree.gen_dir(self)
	print self.zs
#-------------------------------------
# Make a Directory Project Tree
#-------------------------------------
 def make_tree(self):
	counter = 0
	print "This project tree for " + self.dir_sub[0:-1] + " was completed
by "
	print "Generated on " + strftime("%m/%d/%Y at %H.%M hours")
	print "The project tree / dictionary was found to have the following:
\n"
	
#-------------------------------------------------------------------------
	# Iterate over items in the dictionary, creating tuples of key/value
pairs
	
#-------------------------------------------------------------------------
	for key, values in self.proj.iteritems():
		counter = counter + 1
		print "Key #" + str(counter) + " is "  + "'" + key + "\\"
		print "For this key, the values are " + str(values)
		print "Thus, the results of generating directories for this "
		print " key/values combo are: \n"
		#---------------------------------------------------------
		# Iterate over the invidividual unique values in the list
		# that is associated with each key in the dict, where
		# an individual value may itself be a dict
		#---------------------------------------------------------
		for unique in values:
			prefix = self.root + key +  "/"
			if isinstance(unique, dict) == True:
				for kx,vx in unique.iteritems():
					if isinstance(vx,list) == True:
						for items in vx:
						  self.pathname = prefix  + kx +  "\\" + items
						  Tree.print_path(self)
					else:
					  self.pathname = prefix  + kx +  "\\" + vx
					  Tree.print_path(self)
			else:
					self.pathname = prefix + unique
					Tree.print_path(self)



if __name__== "__main__":
	#-------------------------------------
	# DEFINE Root Dir & Path, Sch Numbers
	#-------------------------------------
	sch_names     =  ['AD501','AD502','AD503']
	drawing_name  =  'AD601'
	dir_main      =  '\\\MAIN\\PUBLIC\\ABC\\TEST\\'
	dir_sub       =  "MDX\\"
	rootdir       =  dir_main + dir_sub
	#-------------------------------------
	# DEFINE Directory Tree for Project
	#-------------------------------------


	t = Tree(dir_main,dir_sub,sch_names,drawing_name)

	t.make_tree()



More information about the Python-list mailing list