Python: сортировка оптимально и сравнение - PullRequest
0 голосов
/ 03 апреля 2020

Как мне упорядочить список A так, чтобы максимальное количество элементов списка A было больше, чем у другого списка B?

ПРИМЕР:

A='3 6 7 5 3 5 6 2 9 1' 
B='2 7 0 9 3 6 0 6 2 6'

answer = 7 ... ............... Если я сортирую списки,

      sListA = [1, 2, 3, 3, 5, 5, 6, 6, 7, 9]
      sListB = [0, 0, 2, 2, 3, 6, 6, 6, 7, 9]
#if sListA[i]>sListB[j]: count +=1

В 5 случаях sListA[i] > sListB[j]

, но нам нужно максимизировать экземпляры где sListA[i] > sListB[j] .., ie, 7

Если sListA был [1, 2, 3, 3, 5, 7, 9, 5, 6, 6]

, а slistB был [0, 0, 2, 2, 3, 6, 6, 6, 7, 9]

, то 7 экземпляров sListA[i] > sListB[j] будут быть возможным ..

Вот мой код:

 def main():
        listA=list(map(int,A.rstrip().split()))
        listB=list(map(int,B.rstrip().split()))
        sListA=sorted(listA)
        sListB=sorted(listB)
        count=0
        for (i,j) in map(sListA,sListB):
            if sListA[i]>sListB[j]:
                count+=1
        print(count)         
    main()

Но это учитывается только в отсортированных списках, мне нужно найти способ поменять элементы со следующим по величине элементом в sListA когда sListA[i]<sListB[j], чтобы максимизировать случаи, когда sListA [i]> sListB [j]

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

возможно не самый эффективный, но вы можете попробовать

a = [1, 2, 3, 3, 5, 5, 6, 6, 7, 9]
b = [0, 0, 2, 2, 3, 6, 6, 6, 7, 9]
b.sort()
a.sort()

new_a = []
for bb in b:
    idx_v = np.where(np.array(a) > bb)
    if idx_v[0].size == 0:
        break
    else:
        e = a.pop(np.min(idx_v[0]))
        new_a.append(e)
new_a.extend(a)

, вы обнаружите, что

np.sum([new_a[n] > b[n] for n in range(len(b))])

равно 7, а

new_a

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

1 голос
/ 03 апреля 2020

Так что теоретически это должно делать то, что вы хотели:

A='3 6 7 5 3 5 6 2 9 1' 
B='2 7 0 9 3 6 0 6 2 6'

def main():
    listA = sorted(list(map(int,A.rstrip().split())))
    listB = sorted(list(map(int,B.rstrip().split())))
    j = 0
    for i in range(len(listA)):
        if listA[i] <= listB[j]:
            i += 1
        else:
            listA[i], listA[j] = listA[j], listA[i]
            j += 1
    return listA
print(main())

Возвращает:

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

По сути, все, что я сделал, это добавил else к вашему if структура для i подсчета и обмена элементами в listA


Предыдущий ответ (если вас интересует результат 7, в частности):

A='3 6 7 5 3 5 6 2 9 1' 
B='2 7 0 9 3 6 0 6 2 6'
def main():
    listA = sorted(list(map(int,A.rstrip().split())))
    listB = sorted(list(map(int,B.rstrip().split())))
    cnt = 0
    j = 0
    for i in range(len(listA)):
        if listA[i] > listB[j]:
            cnt += 1
            j += 1
        else:
            i += 1
    return cnt
print(main())

Чтобы сделать это для нескольких списков A и B, возможно, попробуйте применить что-то вроде:

Alist=['3 6 7 5 3 5 6 2 9 1', '9 5 3 1 0']
Blist=['2 7 0 9 3 6 0 6 2 6', '5 4 3 4 6']

def main():
    cnt = 0
    for x in range(len(Alist)):
        listA = sorted(list(map(int,Alist[x].rstrip().split())))
        listB = sorted(list(map(int,Blist[x].rstrip().split())))
        j = 0
        for i in range(len(listA)):
            if listA[i] > listB[j]:
                cnt += 1
                j += 1
            else:
                i += 1
    return cnt
print(main())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...