Итерирование по двум спискам одновременно и попытка определить, больше ли число в одном списке, чем число в другом списке - PullRequest
0 голосов
/ 10 января 2020

(Извините, если мой заголовок сбивает с толку. Я не уверен, как описать эту проблему)

У меня есть два списка в следующем формате:

list_a = [[10, 1], [25, 2]] # list sorted base on the first element of each pair
list_b = [3, 14, 5, 26]

Я пытаюсь увидеть в этот момент сумма элементов в list_b больше, чем элементов в list_a[i][0], если так, добавьте list_a[i][1] к сумме. Подумайте о том, чтобы сыграть в игру и получить очки в list_b, а также получить бонусные очки, когда вы наберете определенную сумму очков, как указано в list_a.

Мой предполагаемый результат - это последовательность чисел. Для приведенного выше примера:

# [3, 3+14+1, 3+14+1+5, 3+14+1+5+26+2]
# 3+14+1 because 3+14 is greater than 10
# 3+14+1+5+26+2 because 3+14+1+5+26 is greater than 25
[3, 18, 23, 51]

Моя попытка:

sum_b = 0 # used to track sum of items in list_b
output_list = []

for i in list_a:
  for j in list_b:
    # go over list b to get current sum
    sum_b += j

    if sum_b > i[0]: # when I see sum_b > i[0], I add i[1] to sum_b
      sum_b += i[1] 
    output_list.append(sum_b)
    # I want to keep going through the list to see when sum_b gets greater than 25 and add 2 to sum_b

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Пребывание рядом с вашей собственной попыткой, но продвижение ваших i до list_a должным образом. Здесь i всегда является следующей неиспользованной парой list_a (или None, если не осталось ни одного), и я использую ее в правой точке в течение от l oop до list_b.

sum_b = 0 # used to track sum of items in list_b
output_list = []
iter_a = iter(list_a)
i = next(iter_a, None)

for j in list_b:
    # go over list b to get current sum
    sum_b += j

    if i and sum_b > i[0]: # when I see sum_b > i[0], I add i[1] to sum_b
        sum_b += i[1]
        i = next(iter_a, None)
    output_list.append(sum_b)

Это занимает только линейное время, так как я перемещаюсь по обоим спискам параллельно, а не во вложенных циклах полной длины.

2 голосов
/ 11 января 2020

С вашим обновленным квестом кажется, что вы хотите найти кумулятивную сумму list_b и добавить второй элемент внутреннего list_a, когда условие выполнено. Я бы предложил сначала составить список совокупной суммы list_b, а затем выполнить перекрестную проверку list_a и добавить каждый второй элемент, отвечающий требованию:

cumsum_b = [sum(list_b[:i+1]) for i in range(len(list_b))]

# [3, 17, 22, 48]

result = []
for s in cumsum_b:
    for n, i in list_a:
        if s > n:
            s += i
    result.append(s)

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