Обобщить формулу для всего списка списков - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу сделать это

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]]

Надеюсь, это немного помогает, я не уверен, почему это сбивает с толку, возможно, я не объясняю это лучше всего.

1 Ответ

0 голосов
/ 21 ноября 2018

Немного покопавшись, стало ясно, что вы используете неправильный индекс для payment_months и перебираете неправильный range, если хотите, чтобы каждая строка в dates.

Настройка:

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]]

по желанию.

Вы можете на самом делеИзбегайте проблемы полностью, просто будучи немного более питоническим (избегайте индексов, просто обращайтесь к элементам).Это также проясняет, что каждая строка в dates соответствует 1-к-1 с 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)

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...