python中列表中的值差异比较

时间:2015-06-25 03:27:09

标签: python

我有一个嵌套列表,其中包含不同的变量。我试图检查两个连续项之间的差值,如果条件匹配,则将这些项组合在一起。

即。

Item 1 happened on 1-6-2012 1 pm
Item 2 happened on 1-6-2012 4 pm
Item 3 happened on 1-6-2012 6 pm
Item 4 happened on 3-6-2012 5 pm
Item 5 happened on 5-6-2012 5 pm

我想将间隔小于24小时的项目分组。在这种情况下,项目1,2和3属于一个组,项目4属于一个组,项目5属于另一个组。我尝试了以下代码:

Time = []
All_Traps = []
Traps = []
Dic_Traps = defaultdict(list)
Traps_CSV = csv.reader(open("D:/Users/d774911/Desktop/Telstra Internship/Working files/Traps_Generic_Features.csv"))
for rows in Traps_CSV:
    All_Traps.append(rows)

All_Traps.sort(key=lambda x: x[9])
for length in xrange(len(All_Traps)):
        if length == (len(All_Traps) - 1):
            break
        Node_Name_1 = All_Traps[length][2]
        Node_Name_2 = All_Traps[length + 1][2]
        Event_Type_1 = All_Traps[length][5]
        Event_Type_2 = All_Traps[length + 1][5]
        Time_1 = All_Traps[length][9]
        Time_2 = All_Traps[length + 1][9]
        Difference = datetime.strptime(Time_2[0:19], '%Y-%m-%dT%H:%M:%S') - datetime.strptime(Time_1[0:19], '%Y-%m-%dT%H:%M:%S')
        if Node_Name_1 == Node_Name_2 and \
           Event_Type_1 == Event_Type_2 and \
           float(Difference.seconds) / (60*60) < 24:
             Dic_Traps[length].append(All_Traps[Length])

但我遗漏了一些物品。想法?

2 个答案:

答案 0 :(得分:1)

对于排序列表,您可以使用groupby。这是一个简化的示例(您应该将日期字符串转换为datetime对象),它应该给出主要想法:

from itertools import groupby
import datetime

SRC_DATA = [
    (1, datetime.datetime(2015, 06, 20, 1)),
    (2, datetime.datetime(2015, 06, 20, 4)),
    (3, datetime.datetime(2015, 06, 20, 5)),
    (4, datetime.datetime(2015, 06, 21, 1)),
    (5, datetime.datetime(2015, 06, 22, 1)),
    (6, datetime.datetime(2015, 06, 22, 4)),
]

for group_date, group in groupby(SRC_DATA, key=lambda X: X[1].date()):
    print "Group {}: {}".format(group_date, list(group))

输出:

$ python python_groupby.py 
Group 2015-06-20: [(1, datetime.datetime(2015, 6, 20, 1, 0)), (2, datetime.datetime(2015, 6, 20, 4, 0)), (3, datetime.datetime(2015, 6, 20, 5, 0))]
Group 2015-06-21: [(4, datetime.datetime(2015, 6, 21, 1, 0))]
Group 2015-06-22: [(5, datetime.datetime(2015, 6, 22, 1, 0)), (6, datetime.datetime(2015, 6, 22, 4, 0))]

答案 1 :(得分:0)

首先,改变那些可怕的变量名称。 Python有自己的命名变量,类,方法等约定。它被称为蛇案。

现在,您需要做什么:

import datetime as dt
import pprint

ts_dict = {}

with open('timex.dat', 'r+') as f:
        for line in f.read().splitlines():
                if line:
                    item = line.split('happened')[0].strip().split(' ')[1]
                    timestamp_string = line.split('on')[-1].split('pm')[0]
                    datetime_stamp = dt.datetime.strptime(timestamp_string.strip(), "%d-%m-%Y %H")
                    ts_dict[item] = datetime_stamp

这是一种给你这个的黑客方式:

item_timestamp_dict= {
 '1': datetime.datetime(2012, 6, 1, 1, 0),
 '2': datetime.datetime(2012, 6, 1, 4, 0),
 '3': datetime.datetime(2012, 6, 1, 6, 0),
 '4': datetime.datetime(2012, 6, 3, 5, 0),
 '5': datetime.datetime(2012, 6, 5, 5, 0)}

项目#的字典为密钥,其日期时间时间戳为值。

您可以使用日期时间时间戳值'item_timestamp_dict['1'].hour值进行计算。

编辑:它可以进行很多优化。