【问题标题】:How to map multiple aliases back to single value in python如何在python中将多个别名映射回单个值
【发布时间】:2021-04-29 22:10:40
【问题描述】:

我正在尝试使用 python 字典,以便每个键都有一个字符串列表,以便该列表中的任何单个字符串都可以解释为它们本身的键。不确定这是否正确使用字典。对这个世界来说相对较新。欢迎使用其他解决方案。

facilities = {'Name 1': ['Abr. 1', 'Alternate Name 1', 'Name1', 'Name #1'],
              'Name 2': ['Abr. 2', 'Alternate Name 2', 'Name2', 'Name #2', 'Nm. 2'],
              'Name 3': ['Abr 3', 'Alt Name 3', 'Name3', 'Nm. 3']}

user_input1 = 'Alternate Name 2'

user_input2 = 'Nm 3.'

user_input3 = 'Abr. 1'

user_input4 = 'Alternate Name 1'

然后我会执行某种操作,以便 operation(user_input) 根据 user_input 的值返回“名称 1”、“名称 2”或“名称 3”(假设它位于3 个定义的列表)。上面列出的 4 个 user_inputs 将分别生成“Name3”、“Name2”、“Name1”和“Name 1”。

【问题讨论】:

    标签: python dictionary alias


    【解决方案1】:

    这是 user_input1 的一种方法。

    [k for k, v in facilities.items() if user_input1 in v]
    

    当然你可以把它包装在一个函数中:

    def parse_user_input(user_input):
        return [k for k, v in facilities.items() if user_input in v]
    

    【讨论】:

    • 这让我得到了我需要的东西。我认为列表理解可能会让我到达那里,只是无法弄清楚。感谢您的帮助。
    • @JB-747 如果这有帮助,你能投票吗? upvote 表示“答案很有用”(即使您不选择此作为答案,信用点也会有所帮助,谢谢)
    • 我愿意。刚试过,但看起来我还没有足够的积分来做这件事。系统告诉我需要 15 分才能投票,而我只有 11 分。
    • 啊,我忘了!感谢您的尝试!
    【解决方案2】:

    您可以创建另一个 dict 来反转映射,但也可以在别名列表中创建 flattens。所以有多个dict条目指向同一个字符串。

    我们可以通过遍历所有别名并检查它们是否指向同一个名称来测试它。

    facilities = {'Name 1': ['Abr. 1', 'Alternate Name 1', 'Name1', 'Name #1'],
                  'Name 2': ['Abr. 2', 'Alternate Name 2', 'Name2', 'Name #2', 'Nm. 2'],
                  'Name 3': ['Abr 3', 'Alt Name 3', 'Name3', 'Nm. 3']}
    
    revmap = {alias: k for k, v in facilities.items() for alias in v}
    
    from itertools import chain
    for alias in chain.from_iterable(facilities.values()):
        print('%s => %s' % (alias, revmap[alias]))
    

    【讨论】:

    • 这当然更优雅地使用了字典。虽然我猜这种方法不允许发生冲突(考虑到问题,映射是唯一的合理假设)。
    • @William 你是绝对正确的。如果发生这种碰撞,最好给出错误。毕竟他们是别名。所以你想知道他们是否模棱两可。另一个解决方案也有类似的问题。在发生冲突的情况下,它会选择它找到的第一个,而在这个解决方案中,后面的副本将替换字典中较早的副本。
    【解决方案3】:

    谢谢!有了上面的两个答案和讨论,我想出了这个功能来创建一个新的字典。它可以防止输入导致不明确的映射。我还意识到我需要将原始键映射到自己,对于 user_input 是原始键之一的情况,它只是返回自己。

    def alias_lookup_dict(alias_dict):
        
        # Get List of all Aliases
        aliases_flat = [item for sublist in list(alias_dict.values()) for item in sublist]
        
        # Create a reversed and flattened dictionary
        rev_alias_dict = {alias: k for k, v in alias_dict.items() for alias in v}
        
        # Create a dictionary mapping the original keys to themselves
        orig_keys = {k: k for k in alias_dict.keys()}
        
        # If no potential for ambiguous mappings, merge rev_alias_dict and orig_keys
        if len(aliases_flat) == len(set(aliases_flat)):
            
            # Merge dict w/ original keys mapped to themselves w/ the reversed/flattened dict
            rev_alias_dict.update(orig_keys)
            return rev_alias_dict
            
        # If potential for ambiguous mappings, return empty dictionary and print warning
        else:
            
            return {}        
            print('Repeated aliases detected.  Potential for ambiguous mappings.')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 2021-11-02
      • 1970-01-01
      • 2012-04-21
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多