在python中的“减少”功能不工作在“namedtuple”?

问题描述:

我有一个是通过以下方式格式化的日志文件:在python中的“减少”功能不工作在“namedtuple”?

datetimestring \t username \t transactionName \r\n 

我试图运行在该数据集的一些统计数据。我有以下代码:

import time 
import collections 
file = open('Log.txt', 'r') 

TransactionData = collections.namedtuple('TransactionData', ['transactionDate', 'user', 'transactionName']) 
transactions = list() 

for line in file: 
    fields = line.split('\t') 

    transactionDate = time.strptime(fields[0], '%Y-%m-%d %H:%M:%S') 
    user = fields[1] 
    transactionName = fields[2] 

    transdata = TransactionData(transactionDate, user, transactionName) 
    transactions.append(transdata) 

file.close() 

minDate = reduce(lambda x,y: min(x.transactionDate, y.transactionDate), transactions) 
print minDate 

我不想定义一个类这样一个简单的数据集,所以我使用的名称元组。当我尝试运行,我得到这个错误:

Traceback (most recent call last): 
    File "inquiriesStat.py", line 20, in <module> 
    minDate = reduce(lambda x,y: min(x.transactionDate, y.transactionDate), transactions) 
    File "inquiriesStat.py", line 20, in <lambda> 
    minDate = reduce(lambda x,y: min(x.transactionDate, y.transactionDate), transactions) 
AttributeError: 'time.struct_time' object has no attribute 'transactionDate' 

看来,lambda函数是在“transactionDate”性质而工作,而不是直接传递完整的元组。如果我将lambda更改为:

lambda x,y: min(x, y) 

它按我的预期工作。任何想法,为什么会是这种情况?

+0

我相信一个没有'reduce'的世界...... – JBernardo

只需使用:

minDate = min(t.transactionDate for t in transactions) 

下面就是为什么你的代码是不工作的说明。

比方说transactions = [t1, t2, t3]其中t1 ... t3是三个命名元组。

通过的reduce的定义,你的代码:

reduce(lambda x,y: min(x.transactionDate, y.transactionDate), transactions) 

相当于

min(min(t1.transactionDate, t2.transactionDate).transactionDate, t3.transactionDate) 

显然,内min()回报time.struct_time,而不是一个名为元组,所以当reduce尝试应用.transactionDate对它来说,那失败了。

有办法解决这个问题,并利用reduce来解决这个问题。然而,min直接应用这个工作似乎没有什么意义,我的眼睛比涉及reduce的任何东西都清晰得多。

+2

或'key = operator.attrgetter('transactionDate')'。当有内置功能执行相同操作时,不要使用'lambda'。 – agf

+1

reduce不起作用,因为要减少的第一个调用(time.struct_time)的结果作为下一个调用的参数之一传入。 – Duncan

+1

@agf:为什么在效率或者实际上使'operator.attrgetter'更好? –