Iterating Through Dictionary of Lists

JB jamesb7us at gmail.com
Mon Sep 14 13:48:08 EDT 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

AltStyle によって変換されたページ (->オリジナル) /