为整个列表概括公式

2024-10-02 00:22:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这么做

firstdates = dates[0]
paystring = []
for i in range(len(payment_months)):
    if payment_months[i] < firstdates[i]:
        paystring.append(0)
    else:
        paystring.append(((payment_months[i] + 12 - firstdates[i]) + 1) % 12)
print(paystring)

但是我想为所有的日期做这个,这是一个列表列表。例如,让我们只关注前两行日期。你知道吗

print(dates[0:2])

给了我

[[8, 8, 7, 7, 6, 5, 4, 4, 11, 10, 10, 8], [7, 6, 3, 2, 2, 2, 1, 0, 11, 10, 10, 9]]

以及

print(payment_months)

给了我

[8, 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, 9]

运行此命令后:

paystring = []
for i in range(len(payment_months)):
    paystring.append([])
    for j in range(len(dates[i])):
        if payment_months[i] < dates[i][j]:
            paystring[i].append(0)
        elif NDD_day[j] > 1:
            paystring[i].append((payment_months[i] + 12 - dates[i][j]) % 12)
        else:
            paystring[i].append( ((payment_months[i] + 12 - dates[i][j]) + 1) % 12)
print(paystring[0:2])

我应该得到这个:

[[1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2], [2, 2, 4, 4, 3, 2, 2, 2, 2, 2, 1, 1]]

但我得到的却是:

[[0, 0, 1, 1, 2, 3, 4, 5, 0, 0, 0, 0], [0, 1, 4, 5, 5, 5, 6, 8, 0, 0, 0, 0]]

有人能帮我修改代码吗?你知道吗

下面是一个手写的例子,应该非常清楚:

enter image description here

我尝试将代码更改为:

# Calculate paystring
paystring = []
for i in range(len(payment_months)):
    paystring.append([])
    for j in range(len(dates[i])):
        if payment_months[i] < dates[j][i]:
            paystring[i].append(0)
#         elif NDD_day[j] > 1:
#             paystring[i].append((payment_months[i] + 12 - dates[j][i]) % 12)
        else:
            paystring[i].append( ((payment_months[i] + 12 - dates[j][i]) + 1) % 12)
print(paystring[0:2])

给了我这个:

[[1, 2, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1], [0, 2, 0, 0, 0, 2, 0, 0, 1, 1, 0, 1]]

希望这有点帮助,我不知道为什么这是困惑也许我没有解释这是最好的。你知道吗


Tags: in列表forlenifrangepaymentelse
1条回答
网友
1楼 · 发布于 2024-10-02 00:22:59

在对它进行了一段时间的摆弄之后,最终很明显您对payment_months使用了错误的索引,并且如果您希望dates中的每一行都使用错误的range进行迭代。你知道吗

设置:

In [35]: dates

Out[35]:
[[8, 8, 7, 7, 6, 5, 4, 4, 11, 10, 10, 8],
 [7, 6, 3, 2, 2, 2, 1, 0, 11, 10, 10, 9]]

In [37]: payment_months
Out[37]: [8, 7, 6, 5, 4, 3, 2, 1, 12, 11, 10, 9]

然后我们有:

paystring = []
for i in range(len(dates)): # len(payment_months) -> len(dates)
    paystring.append([])
    for j in range(len(dates[i])):
        if payment_months[j] < dates[i][j]: # Switched from i to j
            paystring[i].append(0)
        else:
            paystring[i].append( ((payment_months[j] + 12 - dates[i][j]) + 1) % 12) # Switched from i to j

输出:

In [42]: paystring
Out[42]: [[1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2], [2, 2, 4, 4, 3, 2, 2, 2, 2, 2, 1, 1]]

根据需要。你知道吗

实际上,您可以完全避免这个问题,只需要做一点Pythonic(避免索引,只访问元素)。这也使得dates中的每一行都与payment_months一一对应:

paystring = []
for date_row in dates:
    paystring.append([])
    for date, payment_month in zip(date_row, payment_months):
        if payment_month < date:
            paystring[-1].append(0)
        else:
            paystring[-1].append( ((payment_month + 12 - date) + 1) % 12)

嗯。你知道吗

相关问题 更多 >

    热门问题