RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 578332
Accepted
Андрей Крузлик
Андрей Крузлик
Asked:2020-10-15 12:32:13 +0000 UTC2020-10-15 12:32:13 +0000 UTC 2020-10-15 12:32:13 +0000 UTC

如何统计给定键在字典中相同元素值的个数?

  • 772

如何按键最佳地计算相同的字典?

例如,有字典:

S1={ 'имя':'женя', 'дом':'77'}
S2={ 'имя':'егор', 'дом':'77'}
S3={ 'имя':'иван', 'дом':'55'} 
S4={ 'имя':'вася', 'дом':'44'}
S5={ 'имя':'жора', 'дом':'33'}

结论:

2人住在77号房,1人住在55号房,1人住在44号房,1人住在33号房。

python
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. MaxU - stop genocide of UA
    2020-10-15T15:21:07Z2020-10-15T15:21:07Z

    我会使用collections.Counter():

    In [10]: from collections import Counter
    
    In [11]: Counter([d['дом'] for d in [S1, S2, S3, S4, S5]])
    Out[11]: Counter({'33': 1, '44': 1, '55': 1, '77': 2})
    

    或者,正如@TimofeyBondarev 所建议的,一个更经济的选择:

    In [4]: Counter(d['дом'] for d in [S1, S2, S3, S4, S5])
    Out[4]: Counter({'33': 1, '44': 1, '55': 1, '77': 2})
    
    • 5
  2. Best Answer
    rusnasonov
    2020-10-15T15:17:08Z2020-10-15T15:17:08Z

    可以以不同的方式考虑最优。它可以在速度、内存、理解所写内容的复杂性以及使用的库数量方面达到最佳。

    这是其中一个选项,在我看来,很容易理解正在发生的事情,并且最好从内存中理解,因为没有复制源数据

    from itertools import groupby
    
    a=[{ 'имя':'женя', 'дом':'77'},
       { 'имя':'егор', 'дом':'77'},
       { 'имя':'иван', 'дом':'55'},
       { 'имя':'вася', 'дом':'44'},
       { 'имя':'жора', 'дом':'33'}]
    
    r = groupby(sorted(a, key=lambda x: x['дом']), lambda x: x['дом'])
    
    for k, g in r:
         print(k, len(list(g)))
    
    • 3
  3. vadim vaduxa
    2020-10-16T01:19:52Z2020-10-16T01:19:52Z
    sg = tuple(s.get('дом') for s in [S1, S2, S3, S4, S5])
    x = {s: sg.count(s) for s in set(sg)}
    print(x)
    

    出去:

    {'55': 1, '44': 1, '33': 1, '77': 2}
    

    表现

    import timeit, random
    from collections import Counter
    from itertools import groupby
    
    def T_tuple():
        sg = tuple(s.get('дом') for s in S)
        return {s: sg.count(s) for s in set(sg)}
    
    def C_Counter():
        return Counter([d['дом'] for d in S])
    
    def G_groupby():
        r = groupby(sorted(S, key=lambda x: x['дом']), lambda x: x['дом'])
        return [(k, len(list(g))) for k, g in r]
    
    
    if __name__ == '__main__':
        fns = C_Counter, G_groupby, T_tuple
    
        for s, h in [(10000, 10), (10000, 100), (10000, 1000), (10, 10), (10, 100), (10, 1000)]:
            S = [{'имя': r, 'дом': random.randrange(h)} for r in range(s)]
            print('\nlen(S):', s, 'len(дом):', h)
            t = [(fn.__name__,
                  timeit.Timer(fn).timeit(10)) for fn in fns]
    
            for e, (n, tmt) in enumerate(sorted(t, key=lambda r: r[1]), start=1):
                print("{}' {:.4} {}".format(e, tmt, n))
    

    出去:

    len(S): 10000 len(дом): 10
    1' 0.01853 C_Counter
    2' 0.05015 T_tuple
    3' 0.06918 G_groupby
    
    len(S): 10000 len(дом): 100
    1' 0.01672 C_Counter
    2' 0.08368 G_groupby
    3' 0.2862 T_tuple
    
    len(S): 10000 len(дом): 1000
    1' 0.02135 C_Counter
    2' 0.09862 G_groupby
    3' 2.634 T_tuple
    
    len(S): 10 len(дом): 10
    1' 7.795e-05 T_tuple
    2' 0.0001365 G_groupby
    3' 0.000157 C_Counter
    
    len(S): 10 len(дом): 100
    1' 0.0001153 C_Counter
    2' 0.0001153 T_tuple
    3' 0.000209 G_groupby
    
    len(S): 10 len(дом): 1000
    1' 0.0001025 T_tuple
    2' 0.0001058 C_Counter
    3' 0.0001683 G_groupby
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5