Python 在zip/列表理解中使用namedtuple

Python 在zip/列表理解中使用namedtuple,python,Python,我正在为某些与金融相关的概念说明编写一些代码。下面是我的一个例子;请注意,我必须重复这段代码十几次,因此需要回答这个问题: 支出=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09] 收益率=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04] 当前_值=[每个[0]/1+每个[1]**i代表i,每个在分配中,收益率,1] 打印当前值为,SUM当前值 现在,如果我将此代码埋在一个包中,或

我正在为某些与金融相关的概念说明编写一些代码。下面是我的一个例子;请注意,我必须重复这段代码十几次,因此需要回答这个问题:

支出=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09] 收益率=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04] 当前_值=[每个[0]/1+每个[1]**i代表i,每个在分配中,收益率,1] 打印当前值为,SUM当前值
现在,如果我将此代码埋在一个包中,或者如果我将此代码发送给程序员,这一切都很好,但我真的很讨厌在当前值计算中使用每个[0]和每个[1],这是一个发送给大多数非程序员的代码。在最小更改的情况下,如何在当前值列表计算中使用类似each.payout和each.yield\u rate的内容?我想我想在这里使用类似于命名双倍的“输入”、“支付”、“收益率”,但我不知道如何在不带额外行李的情况下进行操作。

也许你不需要使用命名双倍。也可以使用元组解包而不是索引:

present_values = [payout / (1 + yield_rate) ** i for i, (payout, yield_rate) in enumerate(zip(payouts, yield_rates), 1)]

也许你不需要使用命名的元组。也可以使用元组解包而不是索引:

present_values = [payout / (1 + yield_rate) ** i for i, (payout, yield_rate) in enumerate(zip(payouts, yield_rates), 1)]
我对mkrieger1的回答感到愤慨,您应该只使用解包,但是,如果您确实想使用命名的耦合,您可以执行以下操作:

Entry =  namedtuple('Entry', ['payout', 'yield_rate'])

payouts = [1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09]
yield_rates = [0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]
entries = map(Entry, payouts, yield_rates)
present_values = [
    entry.payout / (1 + entry. yield_rate)**i 
    for i, entry in enumerate(entries)
]
很可能,支付和收益率应该是某种类型的输入对象,无论是由namedtuple工厂生成的类还是手写类。

我不同意mkrieger1的回答,即您应该只使用解包,但是,如果您确实想使用namedtuple,您可以执行以下操作:

Entry =  namedtuple('Entry', ['payout', 'yield_rate'])

payouts = [1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09]
yield_rates = [0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]
entries = map(Entry, payouts, yield_rates)
present_values = [
    entry.payout / (1 + entry. yield_rate)**i 
    for i, entry in enumerate(entries)
]

很可能,支付和收益率应该是某种类型的输入对象,无论是由namedtuple工厂生成的类还是手写类。

当您尝试使用namedtuple时发生了什么?它没有额外的包袱,如果是这样,那也没关系。坦白说,我只是不能将它与zip一起使用:/对不起,我不是指代码性能方面的包袱,而是指代码的可读性或简洁性,如果您继续在for循环目标列表中解包:对于I,payout,yield in enumerate…当您尝试使用namedtuple时发生了什么?它没有额外的负担,如果是的话,那也没关系。坦率地说,我只是不能将它与zip一起使用:/对不起,我不是指代码性能方面的负担,而是指代码可读性或简洁性,如果您继续在for循环目标列表中解包的话:对于I,支出,枚举中的收益……很好,我不知道地图有内置的拉链。不错,我不知道地图有内置的拉链。