&引用;减少;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)