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

在Python中最有效地迭代大型词典列表

  •  1
  • MyNameIsCaleb  · 技术社区  · 6 年前

    我看到了一些类似问题的答案,但我不确定它们是否是解决我问题的最佳方法。

    我有一个非常大的表(100000+行20+列)作为字典列表处理。我需要使用比较对这个列表进行部分重复数据消除。我在下面简化了一个我正在做的例子。

    table = [
        { "serial": "111", "time": 1000, "name": jon },
        { "serial": "222", "time": 0900, "name": sal },
        { "serial": "333", "time": 1100, "name": tim },
        { "serial": "444", "time": 1300, "name": ron },
        { "serial": "111", "time": 1300, "name": pam }
        ]
    
    for row in table:
        for row2 in table:
            if row != row2:
                if row['serial'] == row2['serial']:
                    if row['time'] > row2['time']:
                        action
    

    谢谢你的帮助!

    4 回复  |  直到 6 年前
        1
  •  2
  •   blhsing    6 年前

    你可以把这张桌子分类 serial 作为主键和 time 序列号 :

    from operator import itemgetter
    table = [
        { "serial": "111", "time": "1000", "name": "jon" },
        { "serial": "222", "time": "0900", "name": "sal" },
        { "serial": "333", "time": "1100", "name": "tim" },
        { "serial": "444", "time": "1300", "name": "ron" },
        { "serial": "111", "time": "1300", "name": "pam" }
    ]
    last_serial = ''
    for d in sorted(table, key=itemgetter('serial', 'time'), reverse=True):
        if d['serial'] != last_serial:
            action(d)
        last_serial = d['serial']
    
        2
  •  2
  •   lvc    6 年前

    对于这么多的数据来说会相当慢。相反,看看 Pandas 适用于您的用例-它已经针对此类工作进行了优化。

        3
  •  0
  •   John Luscombe    6 年前

    这个 serialNumbersList . 只有一次出现的序列号,我们知道它们不可能是重复的,所以我们从 序列号列表

        4
  •  0
  •   khachik    6 年前

    @GiraffeMan91只是为了澄清我的意思(在这里直接输入,不要复制粘贴):

    serials = collections.defaultdict(list) 
    for d in table:
        serials[d.pop('serial')].append(d)
    
    def process_serial(entry):
        serial, values = entry
        # remove duplicates, take action based on time
        # return serial, processed values
    
    results = dict(
        multiprocess.Pool(10).imap(process_serial, serials.iteritems())
    )