代码之家  ›  专栏  ›  技术社区  ›  shantanuo

计算字典列表中的相似值

  •  0
  • shantanuo  · 技术社区  · 3 年前

    我有一份字典清单,我需要计算唯一的词条。 然后,我需要根据元组对值进行排序,该元组是关键字“corrected_word”(2<3<33)的一部分

    mylist = [
    {'original_word': 'test1', 'corrected_word': ('test12', 3)},
    {'original_word': 'test1', 'corrected_word': ('test12', 3)},
    {'original_word': 'test2', 'corrected_word': ('test22', 2)},
    {'original_word': 'test3', 'corrected_word': ('test3', 33)},
    {'original_word': 'test3', 'corrected_word': ('test3', 33)},
    {'original_word': 'test3', 'corrected_word': ('test3', 33)}
    ]
    
    

    预期输出:

    mylist = [
    {'original_word': 'test2', 'corrected_word': ('test22', 2, 1)},
    {'original_word': 'test1', 'corrected_word': ('test12', 3, 2)},
    {'original_word': 'test3', 'corrected_word': ('test3', 33, 3)}
    ]
    

    我试过这样做:

    from collections import Counter
    Counter([str(i) for i in mylist])
    

    但它不会返回字典列表。

    3 回复  |  直到 3 年前
        1
  •  1
  •   pho    3 年前

    创建一个元组列表,其中每个元组的第一个元素是原始单词,其余元素是相应的 corrected_word 元组中的元素。然后将此列表放入 计数器

    来自集合导入计数器
    ctr=计数器((mylist中项目的(item['original_word'],*item['corrected_word']))
    

    这提供了:

    计数器({(‘test3’,‘test3‘,33):3,(‘test1’,‘est12’,3):2,(‘est2’,‘test 22’,2):1})
    

    然后,构建结果列表,并根据所需值进行排序:

    result=排序([
    {'original_word':ow,'corrected_word':(*cw,count)}对于(ow,*cw),在ctr.items()中计数
    ],key=lambda项:项['corrected_word'][1])
    

    这给出了所需的结果:

    [
    {'original_word':'test2','corrected_word':('test22',2,1)},
    {'original_word':'test1','corrected_word':('test12',3,2)},
    {‘original_word’:‘test3’,‘corrected_word’:(‘test3‘,33,3)}
    ]
    

    在线试用

    然后,构建结果列表,并根据所需值进行排序:

    result = sorted([
              {'original_word': ow, 'corrected_word': (*cw, count)} for (ow, *cw), count in ctr.items()
              ], key=lambda item: item['corrected_word'][1])
    

    这给出了所需的结果:

    [
     {'original_word': 'test2', 'corrected_word': ('test22', 2, 1)},
     {'original_word': 'test1', 'corrected_word': ('test12', 3, 2)},
     {'original_word': 'test3', 'corrected_word': ('test3', 33, 3)}
    ]
    

    在线试用!

        2
  •  1
  •   arrmansa    3 年前
    1. 转换为计数器之前的元组
    2. 转换回dicts并添加计数
    3. 根据数字排序
    def dict_and_add_count(item):
        original_data, count = item
        original_dict = dict(original_data)
        original_dict['corrected_word'] = (*original_dict['corrected_word'], count)
        return original_dict
    
    counted_unique_tuples = Counter(tuple(d.items()) for d in mylist)
    dict_with_count = map(dict_and_add_count, counted_unique_tuples.items())
    sorted_dicts = sorted(dict_with_count, key=lambda x: x['corrected_word'][1])
    

    sorted_dicts将是

    [{'original_word': 'test2', 'corrected_word': ('test22', 2, 1)},
    {'original_word': 'test1', 'corrected_word': ('test12', 3, 2)},
    {'original_word': 'test3', 'corrected_word': ('test3', 33, 3)}]