在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)
它按我的预期工作。任何想法,为什么会是这种情况?
答
只需使用:
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
的任何东西都清晰得多。
我相信一个没有'reduce'的世界...... – JBernardo