将Dictionary中的键组合成列表中的元组

时间:2016-03-19 12:40:02

标签: python list dictionary tuples

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

如下所示,我想找到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')]

5 个答案:

答案 0 :(得分:6)

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

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']
]

答案 1 :(得分: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')}

答案 2 :(得分:1)

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

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)

答案 3 :(得分:1)

首先不需要迭代搜索值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)

答案 4 :(得分:1)

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']

temp_list = []
final_list = []

for word in l:
    temp_list = []
    for (x,y) in d.items():
        if y == word:
            temp_list.append(x)
    if len(temp_list) == 0:
        temp_list.append(word)
    final_list.append(tuple(temp_list))

print final_list