【问题标题】:Combining Keys in Dictionary into tuples in a list将字典中的键组合成列表中的元组
【发布时间】:2016-03-19 12:40:01
【问题描述】:

我正在寻找一种解决方案,根据列表作为值在字典中搜索键,然后将键附加到元组列表中。我能够搜索正确的键,但找不到构建我期望的列表的方法。感谢您的帮助。

如下所示,我想在d 中找到与列表l 中的元素相等的所有键,然后将所有搜索到的键进一步放入元组列表中,如预期输出所示。

d = {'acutrar': 'acutrar',
 'aguosa': 'aguoso',
 'capitalizareis': 'capitalizar',
 'conocerán': 'conocer',
 'conociéremos': 'conocer',
 'conocían': 'conocer',
 'conocías': 'conocer',
 'conozcas': 'conocer',
 'pales': 'palar',
 'planeareis': 'planear',
 'planearás': 'planear',
 'planeasteis': 'planear',
 'planeáramos': 'planear'}

l = ['conocer', 'NOT FOUND', 'NOT FOUND', 'planear']

for word in l:
    for (x,y) in d.items():
        if y == word:
            print(word, x) #I can only search for the keys but don't know how to build that list of tuples

预期输出:

[('conocerán','conocías','conozcas','conocían','conociéremos'),('NOT FOUND'),('NOT FOUND'),('planeáramos','planeareis','planearás','planeasteis')]

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    为什么不将字典转换为更合适/更方便的结构并通过键执行 O(1) 查找,而不是遍历所有项并搜索值: p>

    from collections import defaultdict
    
    d = {'acutrar': 'acutrar',
     'aguosa': 'aguoso',
     'capitalizareis': 'capitalizar',
     'conocerán': 'conocer',
     'conociéremos': 'conocer',
     'conocían': 'conocer',
     'conocías': 'conocer',
     'conozcas': 'conocer',
     'pales': 'palar',
     'planeareis': 'planear',
     'planearás': 'planear',
     'planeasteis': 'planear',
     'planeáramos': 'planear'}
    
    
    t = defaultdict(list)
    for key, value in d.items():
        t[value].append(key)
    
    l = ['conocer', 'NOT FOUND', 'NOT FOUND', 'planear']
    
    print([t.get(item, [item]) for item in l])
    

    打印:

    [
        ['conozcas', 'conociéremos', 'conocías', 'conocerán', 'conocían'], 
        ['NOT FOUND'], 
        ['NOT FOUND'], 
        ['planeáramos', 'planearás', 'planeareis', 'planeasteis']
    ]
    

    【讨论】:

      【解决方案2】:

      您的结果令人惊讶地是键和值的混合。

      可以得到更均匀的解

      [tuple(k for (k,v) in d.items() if v == w) for w in l]  
      

      [('conocías', 'conozcas', 'conociéremos', 'conocerán', 'conocían'),
       (),
       (),
       ('planeareis', 'planeáramos', 'planeasteis', 'planearás')]
      

      或:

      {w:tuple(k for (k,v) in d.items() if v == w) for w in l}
      

      {'conocer': ('conocías', 'conozcas', 'conociéremos', 'conocerán', 'conocían'),
       'NOT FOUND': (),
       'planear': ('planeareis', 'planeáramos', 'planeasteis', 'planearás')}
      

      【讨论】:

        【解决方案3】:

        要获得预期的输出,您可以像这样构建元组列表:

        for word in l:
            hits = tuple()
            for (x,y) in d.items():
                if y == word:
                    hits += (x,)
            if not hits:
                hits = ('NOT FOUND',)
            results.append(hits)
        
        print(results)
        

        【讨论】:

          【解决方案4】:

          首先无需在 IMO 搜索值列表上进行迭代。

          你可以这样做:

          final = []
          
          for k, v in d.items():
              if v in l:
                  final.append(k)
          final = tuple(final)
          

          但您甚至可以通过如下列表理解来简化它:

          final = tuple(k for k, v in d.items() if v in l)
          

          【讨论】:

            猜你喜欢
            • 2017-09-16
            • 2015-10-24
            • 2018-10-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-11
            • 1970-01-01
            • 2018-01-20
            相关资源
            最近更新 更多