【问题标题】:Map dictionary values to a list将字典值映射到列表
【发布时间】:2018-09-21 02:24:21
【问题描述】:

我有一本字典,其值是一个列表:

dict ={10: ['jhon', 'abc', 'wa@gmail.com'], 12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}

现在我像这样访问它们: dict[10][0]

但这让人很困惑,因为我不知道特定键的列表中索引 0 处的内容。

为此,我有另一个列表可以帮助我索引 i 处的内容。

['Manager Name', 'Owner Name', 'Email']

所以知道这很容易访问我的字典的值。就像我想使用:dict[10]['Manager Name'] 而不是dict[10][0]

这在 Python 中可以实现吗?因为我尝试了来自Map two list in to dictionary 的引用但是如何将字典值映射到列表

【问题讨论】:

    标签: python python-3.x python-2.7 dictionary


    【解决方案1】:

    这是classes 的一个明确用例。

    python 没有代表像 ['jhon', 'abc', 'wa@gmail.com'] 这样的公司的列表,而是让您可以将其建模为

    class Company:
        def __init__(self, manager_name, owner_name, email):
            self.manager_name = manager_name
            self.owner_name = owner_name
            self.email = email
    
    companies = {10: Company('jhon', 'abc', 'wa@gmail.com'),
                 12: Company('raghav', 'awdaw', 'raghavpatnecha15@gmail.com'}
    

    这为您提供了比列表更好的界面,因为您可以通过名称而不是索引来访问属性:

    >>> comp = Company('jhon', 'abc', 'wa@gmail.com')
    >>> comp.manager_name
    'jhon'
    >>> comp.owner_name
    'abc'
    >>> comp.email
    'wa@gmail.com'
    

    如果你比较懒,不想手动定义Company类,可以使用collections.namedtuple来减少你要写的代码量:

    from collections import namedtuple
    
    Company = namedtuple('Company', 'manager_name owner_name email')
    

    您还可以轻松地将列表字典转换为 Company 实例的字典:

    companies = {10: ['jhon', 'abc', 'wa@gmail.com'],
                 12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}
    
    comps = {num: Company(*comp) for num, comp in companies.items()}
    # result:
    # {10: Company(manager_name='jhon', owner_name='abc', email='wa@gmail.com'),
    #  12: Company(manager_name='raghav', owner_name='awdaw', email='raghavpatnecha15@gmail.com')}
    

    【讨论】:

      【解决方案2】:

      是的,这是可能的。只需将您的字典重组为嵌套字典即可:

      d_input = {10: ['jhon', 'abc', 'wa@gmail.com'],
                 12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}
      
      d = {k: {'Manager Name': a, 'Owner Name': b, 'Email': c} \
              for k, (a, b, c) in d_input.items()}
      

      结果:

      {10: {'Email': 'wa@gmail.com', 'Manager Name': 'jhon', 'Owner Name': 'abc'},
       12: {'Email': 'raghavpatnecha15@gmail.com', 'Manager Name': 'raghav', 'Owner Name': 'awdaw'}}
      

      带有zip的可扩展版本:

      cats = ['Manager Name', 'Owner Name', 'Email']
      
      d = {k: dict(zip(cats, v)) for k, v in d_input.items()}
      

      【讨论】:

      • 如果我的列表和字典值列表的长度是可变的怎么办。假设在这个例子中长度是 3,但如果我添加更多参数,它可以是 8。我不想添加更多 (a,b,c,d,e,f,g,h)。
      【解决方案3】:

      如果您的“属性”始终完全是 ['Manager Name', 'Owner Name', 'Email'],您应该考虑使用 namedtuples 或 Python 3.7 的新 dataclass

      这是一个使用命名元组的示例:

      from collections import namedtuple
      
      Company = namedtuple('Company', ['manager', 'owner', 'email'])
      
      comp = Company('jhon', 'abc', 'wa@gmail.com')
      print(comp.manager, comp.owner, comp.email)
      

      结果为@​​987654324@

      【讨论】:

        【解决方案4】:

        如果您不想更改字典,可以使用另一个字典将索引映射到相应的值。

        >>> d = {10: ['jhon', 'abc', 'wa@gmail.com'], 12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}    
        >>> mapper = {'Manager Name': 0, 'Owner Name': 1, 'Email': 2}    
        >>> d[10][mapper['Manager Name']]
        'jhon'
        >>> d[12][mapper['Email']]
        'raghavpatnecha15@gmail.com'
        

        【讨论】:

          【解决方案5】:

          你应该使用named tuples

          您的代码可能如下所示:

          from collections import namedtuple
          
          Company = namedtuple('Company', 'ManagerName OwnerName Email')
          
          c1 = Company('jhon', 'abc', 'wa@gmail.com')
          c2 =  Company('raghav', 'awdaw', 'raghavpatnecha15@gmail.com')
          
          companies = {10: c1, 12: c2}
          companies[10].Email
          

          【讨论】:

            猜你喜欢
            • 2010-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-02
            • 2012-09-17
            • 2021-04-30
            相关资源
            最近更新 更多