Many-to-one mapping (creating equivalence classes)

后端 未结 4 699
花落未央
花落未央 2020-12-31 07:08

I have a project of converting one database to another. One of the original database columns defines the row\'s category. This column should be mapped to a new category in t

相关标签:
4条回答
  • 2020-12-31 08:00

    You could override dict's indexer, but perhaps the following simpler solution would be better:

    >>> assoc_list = ( (('parrot','spam','cheese_shop'), 'sketch'), (('Cleese', 'Gilliam', 'Palin'), 'actors') )
    >>> equiv_dict = dict()
    >>> for keys, value in assoc_list:
        for key in keys:
            equiv_dict[key] = value
    
    
    >>> equiv_dict['parrot']
    'sketch'
    >>> equiv_dict['spam']
    'sketch'
    

    (Perhaps the nested for loop can be compressed an impressive one-liner, but this works and is readable.)

    0 讨论(0)
  • 2020-12-31 08:04

    If you want to have multiple keys pointing to the same value, i.e.

    m_dictionary{('k1', 'k2', 'k3', 'k4'):1, ('k5', 'k6'):2} and access them as,

    `print(m_dictionary['k1'])` ==> `1`.
    

    Check this multi dictionary python module multi_key_dict. Install and Import it. https://pypi.python.org/pypi/multi_key_dict

    0 讨论(0)
  • 2020-12-31 08:11

    It seems to me that you have two concerns. First, how do you express your mapping originally, that is, how do you type the mapping into your new_mapping.py file. Second, how does the mapping work during the re-mapping process. There's no reason for these two representations to be the same.

    Start with the mapping you like:

    monty = { 
        ('parrot','spam','cheese_shop'): 'sketch', 
        ('Cleese', 'Gilliam', 'Palin') : 'actors',
    }
    

    then convert it into the mapping you need:

    working_monty = {}
    for k, v in monty.items():
        for key in k:
            working_monty[key] = v
    

    producing:

    {'Gilliam': 'actors', 'Cleese': 'actors', 'parrot': 'sketch', 'spam': 'sketch', 'Palin': 'actors', 'cheese_shop': 'sketch'}
    

    then use working_monty to do the work.

    0 讨论(0)
  • 2020-12-31 08:12
    >>> monty={ ('parrot','spam','cheese_shop'): 'sketch', 
            ('Cleese', 'Gilliam', 'Palin') : 'actors'}
    
    >>> item=lambda x:[z for y,z in monty.items() if x in y][0]
    >>>
    >>> item("parrot")
    'sketch'
    >>> item("Cleese")
    'actors'
    

    But let me tell you, It will be slow than normal one to one dictionary.

    0 讨论(0)
提交回复
热议问题