【问题标题】:Store key that has duplicate value into a dictionary将具有重复值的键存储到字典中
【发布时间】:2018-07-18 20:25:28
【问题描述】:

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

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

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

list = ['apple', 'banana']

如果有人可以通过创建代码来帮助这个新手,将不胜感激!

【问题讨论】:

  • 投了反对票,因为没有尝试回答。作为一个菜鸟是可以的,但在寻求帮助之前,至少阅读指南并尝试自己。
  • @Skirrebattie 抱歉,我尝试过但没有附加。下次一定要把它包括在内!谢谢!
  • 循环通过for k, v in dictionary.items():。构建一个新的字典,将v[:3] 映射到具有以这些字符开头的值的所有键的列表。

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


【解决方案1】:

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

第一步是使用您想要的 key 对数据进行排序 - 在您的示例中,键是值的前 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】:

    我的尝试:

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

    【讨论】:

      【解决方案3】:
      >>> 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']]
      >>> 
      

      【讨论】:

        【解决方案4】:

        您可以使用正则表达式来捕获相似项目开头的 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']
        

        【讨论】:

        • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 2012-10-22
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        相关资源
        最近更新 更多