title: Converting dict values into a set while preserving the dict
body: <p>I have a dict like this:</p>
  
  <p>(100002: 'APPLE', 100004: 'BANANA', 100005: 'CARROT')</p>
  
  <p>I am trying to make my dict have ints for the keys (as it does now) but have sets for the values (rather than strings as it is now.)  My goal is to be able to read from a .csv file with one column for the key (an int which is the item id number) and then columns for things like size, shape, and color.  I want to add this information into my dict so that only the information for keys already in dict are added.</p>
  
  <p>My goal dict might look like this:</p>
  
  <pre><code>(100002: set(['APPLE','MEDIUM','ROUND','RED']), 100004: set(['Banana','MEDIUM','LONG','YELLOW']), 100005: set(['CARROT','MEDIUM','LONG','ORANGE'])
  </code></pre>
  
  <p>Starting with my dict of just key + string for item name, I tried code like this to read the extra information in from a .csv file:</p>
  
  <pre><code>infile = open('FileWithTheData.csv', 'r')
  for line in infile.readlines():
      spl_line = line.split(',')
      if int(spl_line[0]) in MyDict.keys():
          MyDict[int(spl_line[0])].update(spl_line[1:])
  </code></pre>
  
  <p>Unfortunately this errors out saying <code>AttributeError: 'str' object has no attribute 'update'</code>.  My attempts to change my dictionary's values into sets so that I can then .update them have yielded things like this: <code>(100002: set(['A','P','L','E']), 100004: set(['B','A','N']), 100005: set(['C','A','R','O','T']))</code>
  I want to convert the values to a set so that the string that is currently the value will be the first string in the set rather than breaking up the string into letters and making a set of those letters.</p>
  
  <p>I also tried making the values a set when I create the dict by zipping two lists together but it didn't seem to make any difference.  Something like this
  MyDict = dict(zip(listofkeys, set(listofnames)))
  still makes the whole listofnames list into a set but it doesn't achieve my goal of making each value in MyDict into a set with the corresponding string from listofnames as the first string in the set.</p>
  
  <p>How can I make the values in MyDict into a set so that I can add additional strings to that set without turning the string that is currently the value in the dict into a set of individual letters?</p>
  
  <p>EDIT:
  I currently make MyDict by using one function to generate a list of item ids (which are the keys) and another function which looks up those item ids to generate a list of corresponding item names (using a two column .csv file as the data source) and then I <code>zip</code> them together.</p>
  
  <p>ANSWER:
  Using the suggestions here I came up with this solution.  I found that the section that has set()).update can easily be changed to list()).append to yield a list rather than a set (so that the order is preserved.)  I also found it easier to update by .csv data input files by adding the column containing names to the FileWithTheData.csv so that I didn't have to mess with making the dict, converting the values to sets, and then adding in more data.  My code for this section now looks like this:</p>
  
  <pre><code>MyDict = {}
  infile = open('FileWithTheData.csv', 'r')
  for line in infile.readlines():
      spl_line = line.split(',')
      if int(spl_line[0]) in itemidlist: #note that this is the list I was formerly zipping together with a corresponding list of names to make my dict
          MyDict.setdefault(int(spl_line[0]), list()).append(spl_line[1:])
  print MyDict
  </code></pre>