Search code examples
pythondata-structureslist-comprehensiondictionary-comprehension

Is there a less oddball way to generate this dummy data?


Input: a list of word_types e.g. ["verb", "adjective", "name", "noun]

Desired output: a dictionary of three words for each letter-word_type combination arranged by word_type.

i.e.

{"verbs" : ["Averb1", "Averb2", "Averb3"], [Bverb1, ...], ..., "adjectives" : ["Aadjective1","Aadjectives2", "Aadjectives3"] ... etc

Here's what I used to generate my data.

import string
A_to_Z = list(string.ascii_uppercase)  #  list of letters a-z
lettered_word_types = ["verb", "adjective", "name", "noun"]

class Lexicon:
    def __init__(self, testing = True):
        if testing == True:
            for TYPE in lettered_word_types:
                setattr(self, TYPE + "s", [letter + TYPE for letter in A_to_Z])
        self.__dict__ = {key: [[element + "1", element + "2", element + "3"] for element in value] for key, value in self.__dict__.items()}


data = Lexicon().__dict__

Solution

  • The class serves no purpose, it simply obfuscates what you are doing. To transliterate your code to use a dict directly, you just need:

    result = {}
    for TYPE in lettered_word_types:
        result[TYPE + 's'] = [letter + TYPE for letter in A_to_Z]
    result = {key: [[element + "1", element + "2", element + "3"] for element in value] for key, value in result.items()}
    

    So, just to show that this is indeed equivalent:

    In [1]: import string
        ...: A_to_Z = list(string.ascii_uppercase)  #  list of letters a-z
        ...: lettered_word_types = ["verb", "adjective", "name", "noun"]
        ...:
        ...: class Lexicon:
        ...:     def __init__(self, testing = True):
        ...:         if testing == True:
        ...:             for TYPE in lettered_word_types:
        ...:                 setattr(self, TYPE + "s", [letter + TYPE for letter in A_to_Z])
        ...:         self.__dict__ = {key: [[element + "1", element + "2", element + "3"] for element in value] for key, value in self.__dict__.items()}
        ...:
        ...:
        ...: data = Lexicon().__dict__
    
    In [2]: result = {}
    
    In [3]: for TYPE in lettered_word_types:
        ...:     result[TYPE + 's'] = [letter + TYPE for letter in A_to_Z]
        ...:
    
    In [4]: result = {key: [[element + "1", element + "2", element + "3"] for element in value] for key, value in result.items()}
    
    In [5]: result == data
    Out[5]: True