【问题标题】:Group a List of Tuples by an identical tuple (timestamp) with python itertools使用 python itertools 通过相同的元组(时间戳)对元组列表进行分组
【发布时间】:2016-06-03 20:27:14
【问题描述】:

作为 SQL 查询的结果,我得到了以下未标准化的元组列表。

data = [(...) {u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), u'sensor': u'GP_PRES', u'value': u'96587'}, {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_NO2', u'value': u'0.221'}, {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_TC', u'value': u'14.600'}, {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_HUM', u'value': u'83.94'}, (...) ]

这些是来自多个传感器但时间戳相同的传感器数据。

我想用相同的时间戳对所有传感器值进行分组。这样我就有一个每个相等时间戳的元组列表。

grouped_data = [... {u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), [{u'sensor': u'GP_PRES', u'value': u'96587'}, { u'sensor': u'GP_NO2', u'value': u'0.221'}, {u'sensor': u'GP_TC', u'value': u'14.600'}, {u'sensor': u'GP_HUM', u'value': u'83.94'}]}, ... ]

我知道我可以使用 itertools 中的 groupby() 函数。我不明白我需要什么样的 Key 函数才能按相等的“时间戳”进行分组。

data2 = sorted(data, key= operator.attrgetter('timestamp'))
    for k, g in groupby(data2, keyfunc):
            groups.append(list(g))

【问题讨论】:

    标签: python mysql collections iterator


    【解决方案1】:

    在您的代码中,operator.attrgetter('timestamp') 会引发错误 AttributeError: 'dict' object has no attribute 'timestamp'

    替换成key=lambda d:d['timestamp'],如下图。

    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
    
    import itertools
    import operator
    import datetime
    
    data = [{u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), u'sensor': u'GP_PRES', u'value': u'96587'}, 
            {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_NO2', u'value': u'0.221'}, 
            {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_TC', u'value': u'14.600'}, 
            {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_HUM', u'value': u'83.94'}]
    
    groups = list()
    data2 = sorted(data, key=lambda d:d['timestamp'])
    for k, g in itertools.groupby(data2, key=lambda d:d['timestamp']):
        groups.append(list(g))
    
    print(groups)   # 2 groups
    [[  {u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), u'sensor': u'GP_PRES', u'value': u'96587'}], 
     [  {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_NO2', u'value': u'0.221'}, 
        {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_TC', u'value': u'14.600'}, 
        {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_HUM', u'value': u'83.94'}]]
    

    【讨论】:

    • 谢谢。你介意解释一下使用的 lamda-function 吗?
    • @Maus, Lambda 表达式用于创建匿名函数。表达式 lambda arguments: expression 产生一个函数对象。详细说明请参考here
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多