Сравнить элементы двух списков - PullRequest
2 голосов
/ 24 марта 2020

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

list1=[20,30,50]
list2=[60,40,25]

Здесь только индекс элемента 2 больше, то есть 50> 25, но если мы поменяем местами 50 и 30 в списке1 Итак,

list1=[20,50,30]
list2=[60,40,25]

, тогда 50> 40 (при индекс 1) и 30> 25 (индекс 2). Таким образом, мы получили 2 элемента 50 и 30, которые больше по соответствующему индексу. Вот мой подход

def swap(a,b):
    a,b=b,a
    return a,b
n=3
g=list(map(int,input().split()))
o=list(map(int,input().split()))
c=0
for i in range(n):
    if o[i]>g[i]:
        for j in range(i+1,n):
            if g[j]>o[i]:
                g[i],g[j]=swap(g[i],g[j])
                c+=1
                break
    else:
        c+=1
print(c)

Но для

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

Это дает c = 6, но ожидаемый результат равен c = 7

Ответы [ 2 ]

1 голос
/ 24 марта 2020
list1= [3,6,7,5,3,5,6,2,9,1]
list2= [2,7,0,9,3,6,0,6,2,6]

list1 = sorted(list1)
it = iter(enumerate(list1))
list2  = sorted(list2)
c = next(it)
good = []
for i, n in enumerate(list2 ):
    try:
        while c[1] < n:
            c = next(it)
        good.append([i, c[0]])
        c = next(it)
    except StopIteration:
        break

for idx1, idx2 in good:
    list1[idx1], list1[idx2] = list1[idx2], list1[idx1]

final_l1_l2 = sum(a > b for a, b in zip(list1, list2))# how many l1 are > l2
print(final_l1_l2)

вывод:

   7

также вы можете распечатать list1 и list2 после перестановки:

print(list1)
print(list2)

вывод:

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

Идея состоит в том, чтобы отсортировать оба списка, а затем проверить, какие элементы из list1 больше, чем элементы из list2, если один элемент из list1 меньше, чем текущий элемент из list2 просто go до следующего элемент от list1 до тех пор, пока в list1

больше не будет элементов
1 голос
/ 24 марта 2020

Вы должны отсортировать два списка, а затем пробежать по ним, чтобы найти «совпадения», где значение list1 больше следующего значения list2. Это приведет к сопряжению значений с наименьшей возможной разницей и, следовательно, к максимизации пар.

Например:

list1=[20,30,50]
list2=[60,40,25]

iter1 = iter(sorted(list1))  # iterator to run through sorted list1
n1    = next(iter1,None)     # n1 is current number in list1
count = 0                    # count of paired elements (n1>n2)
for n2 in sorted(list2):               # go through sorted list 2
    while n1 is not None and n1 <= n2: # skip over ineligible items of list1
        n1 = next(iter1,None)
    if n1 is None: break               # stop when list 1 is exhausted
    count += 1                         # count 1 pair and move on to next of list2

print(count) # 2
...