Есть ли другой способ сделать следующую программу в Python - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь сравнить значения в двух списках. Если какое-либо значение в списке list1 превышает значение в list2, мне нужно увеличить счетчик и удалить сравниваемые значения в list1 и list2. Я не должен сравнивать те же элементы, которые сравнивались и удовлетворяли условию ранее.

Я сделал это:

def main():

    list1 = list(map(int,input().split()))
    list2 = list(map(int,input().split()))

    list1.sort()
    list2.sort()
    count = 0

    for i in range(len(list1)):
        for j in range(len(list2)):
            if list1[i] > list2[j]:
                count += 1
            else:
                break
    print(count)

main()

input:

3 6 7 5 3 5 6 2 9 1 
2 7 0 9 3 6 0 6 2 6

После сортировки:

[1, 2, 3, 3, 5, 5, 6, 6, 7, 9]
[0, 0, 2, 2, 3, 6, 6, 6, 7, 9]

мой вывод:

49

Требуемый вывод:

7

Я пытался удалить элементы из списков после выполнения условия, но получаю " Ошибка «Список индексов вне диапазона».

Может кто-нибудь предложить метод, чтобы сделать это, я также попробовал следующий метод:

while len(list1) > 0:
    if list1[0] > list2[0]:
        count += 1
        list1.remove(list1[0])
        list2.remove(list2[0])
    else:
        break
print(count)

Вывод для вышеуказанного метода:

5

желаемый вывод:

7

Есть ли другой способ решения проблемы. Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Если вы можете использовать что-то вроде numpy, вы можете сделать что-то вроде этого:

import numpy as np

a = np.asarray([1, 2, 3, 4, 5, 6])
b = np.asarray([0, 0, 0, 1, 6, 7])

indices_to_keep = np.where((a - b) <= 0 )

count = len(a) - len(indices_to_keep[0])
new_a = a[indices_to_keep]
new_b = b[indices_to_keep]
print(count, new_a, new_b)

Если вы хотите удалить значения из исходных списков, вы бы заменили new_a и new_b с a и b соответственно. Я должен упомянуть, что это сработало бы, если бы у ваших массивов были числовые типы (что, похоже, имеет место в приведенном выше примере).

0 голосов
/ 01 мая 2020

Ваш вопрос просто спрашивает, сколько элементов в list1 больше, чем list2, учитывая, что элементы удалены.

Вы делаете повторные вычисления, делая это вложенным l oop. Просто сохраните минимум list2, итерируйте только list1, чтобы проверить, является ли этот элемент выше минимума list2 или нет. Если да, добавьте счетчик и удалите этот элемент из list2. Сложность: O (mxn). Если list2 отсортирован, то мы можем выполнить двоичный поиск, чтобы найти индекс и удалить его в O (log (n)). Затем сложность становится O (mxlog (n))

list1 = [1, 2, 3, 3, 5, 5, 6, 6, 7, 9]
list2 = [0, 0, 2, 2, 3, 6, 6, 6, 7, 9]


cnt = 0

for li in list1:
  mn = min(list2)
  if li > mn:
    cnt += 1
    list2.remove(mn)

print(cnt)

Ответ: 7

...