&引用;减少;python中的函数不适用于;命名为“双”吗;?
我有一个日志文件,其格式如下:&引用;减少;python中的函数不适用于;命名为“双”吗;?,python,lambda,reduce,Python,Lambda,Reduce,我有一个日志文件,其格式如下: datetimestring \t username \t transactionName \r\n 我正试图在这个数据集上运行一些统计数据。我有以下代码: import time import collections file = open('Log.txt', 'r') TransactionData = collections.namedtuple('TransactionData', ['transactionDate', 'user', 'trans
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'
正如我所期望的那样。你知道为什么会这样吗?只需使用:
minDate = min(t.transactionDate for t in transactions)
下面解释了代码无法工作的原因
假设transactions=[t1,t2,t3]
其中t1
…t3
是三个命名元组
根据的定义,您的代码:
reduce(lambda x,y: min(x.transactionDate, y.transactionDate), transactions)
相当于
min(min(t1.transactionDate, t2.transactionDate).transactionDate, t3.transactionDate)
显然,内部min()
返回time.struct\u time
而不是命名的元组,因此当reduce
尝试对其应用.transactionDate
时,失败
有多种方法可以解决此问题,并利用
reduce
解决此问题。然而,考虑到直接应用min
可以起到作用,而且在我看来比任何涉及reduce
或key=operator.attrgetter('transactionDate')
的操作都要清晰得多,这似乎没有什么意义。当有一个内置函数执行相同的操作时,不要使用lambda
。reduce不起作用,因为要reduce的第一个调用(time.struct_time)的结果作为参数之一传入下一个调用。@agf:why,在效率上是否存在显著差异,或者实际上是什么使得操作员.attrgetter
更可取?与相比,reduce((lambda x,y:x,如果x.transactionDate
哪一个有效;-)@agf:是的,我只是没有经常使用这种效果,以致于它的语法无法真正进入我的脑海,而且我发现,每当我可以对lambda函数执行同样的操作时,却只会导致几%的性能损失时,通常不值得每次都去查找它。(我刚刚做的一个测试显示有4%的差异)我相信一个没有减少的世界。。。
min(min(t1.transactionDate, t2.transactionDate).transactionDate, t3.transactionDate)