将具有重复值的密钥存储到字典中

时间:2018-07-18 20:25:29

标签: python python-3.x list-comprehension

我有一本字典,想存储键值相同的前三个字母的键的名称。例如:

dictionary = {'apple': 'ams2.dfgsdfgsdfg', 'orange': 'bru1.asdfartq', 'grape': 'cph.dfsdfgsdgsdf', 'banana': 'ams4.ewrtwerth' 

由于我希望输出打印具有重复值的键列表(请查看前3个字母),因此最终输出将打印如下列表:

list = ['apple', 'banana']

如果有人可以通过创建代码来帮助菜鸟,将不胜感激!

4 个答案:

答案 0 :(得分:0)

我的尝试

dictionary = {'apple': 'ams2.dfgsdfgsdfg', 'orange': 'bru1.asdfartq', 'grape': 'cph.dfsdfgsdgsdf', 'banana': 'ams4.ewrtwerth'}

duplicate_keys = set()
for k1, v1 in dictionary.items():
    for k2, v2 in dictionary.items():
        if k1 == k2:
            continue
        if v1[:3] == v2[:3]:
            duplicate_keys.add(k1)
            duplicate_keys.add(k2)
print(list(duplicate_keys))

输出:

['apple', 'banana']

答案 1 :(得分:0)

此解决方案避免为每个元素循环遍历字典的每个元素,因为这样做效果不佳:

第一步是使用所需的对数据进行排序-在您的示例中,键是值的前3个字符。

def key_first3(element):
    return element[1][:3]
data = sorted(dictionary.items(), key=key_first3)

现在,您可以使用此键对数据进行分组,并计算组中元素的数量。如果一组中有多个元素,请将其键添加到结果中:

result = []

for key, group in itertools.groupby(data, key=key_first3):
    group = list(group)
    if len(group) > 1:
         result.append(tuple(k for k, v in group))

答案 2 :(得分:0)

>>> from itertools import groupby
>>> d = {'apple': 'ams2.dfgsdfgsdfg', 'orange': 'bru1.asdfartq', 'grape': 'cph.dfsdfgsdgsdf', 'banana': 'ams4.ewrtwerth'}
>>> f = key=lambda x: x[1][:3]
>>> grouped_d = {k:list(dict(v).keys()) for k,v in groupby(sorted(d.items(), key=f), f)}
>>> grouped_d
{'ams': ['apple', 'banana'], 'bru': ['orange'], 'cph': ['grape']}
>>> [v for k,v in grouped_d.items() if len(v)>1]
[['apple', 'banana']]
>>> 

答案 3 :(得分:0)

您可以使用正则表达式来捕获相似项目开头的3个字母。然后使用列表推导找到具有相似3个单词的项的键。决定使用zip。刚实现的字典不再具有属性iteritems()。不能告诉原因

import re

 a = "".join(re.findall(r"(\b\w{3}).*?\1"," ".join(dictionary.values())))    
     [m for m,x in zip(dictionary,dictionary.values()) if a in x]

 ['apple', 'banana']