gpt4 book ai didi

python - python 中的 "reduce"函数在 "namedtuple"上不起作用?

转载 作者:太空狗 更新时间:2023-10-30 02:49:33 27 4
gpt4 key购买 nike

我有一个格式如下的日志文件:

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 的任何事情都清晰得多。

关于python - python 中的 "reduce"函数在 "namedtuple"上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651762/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com