2015-05-25 5 views
1

Я пытаюсь создать два массива, a и b, каждый из которых содержит ~ 1000 случайных чисел. Случайное число находится между 1 и 5.Python Сравнение двух неровных массивов

Я хочу, чтобы затем сравнить каждый элемент в a с соответствующим элементом b таким образом, что если a[i] > b[i] переменных, counter, будет увеличиваться на 1. Это считаются «успехом» , В противном случае, если a[i] <= b[i] ничего не происходит (например, counter += 0). Это считается «неудачей».

Однако и b могут иметь разную длину, такие как len(a) == len(b) и len(a) != len(b).

В случае последнего, если len(a) > len(b) Я бы хотел, чтобы все «лишние» элементы a автоматически учитывались как «успехи». Если len(b) > len(a) вещи должны проходить нормально (то есть «лишние» элементы b игнорируются).

Например:

Если a = [1, 3, 4, 2] и b = [2, 4, 0]

Тогда counter = 2, потому что (1 < 2, 3 < 4, 4 > 0 и 2 является дополнительной и автоматический success`)

Как бы я идти об этом это?

Вот некоторый быстрый код, который возвращает ожидаемую list index out of range... ошибку:

import random 

a = [] 
b = [] 
counter = 0 

for i in range(1000): 
    a += [random.randint(1, 5)] 
for i in range(900): 
    b += [random.randint(1, 5)] 
for i in range(len(a)): 
    if a[i] > b[i]: 
     counter += 1 

print counter 

ответ

2

Просто проверьте, чтобы увидеть, если вы смыв конца b в цикле:

for i in range(len(a)): 
    if (i >= len(b)) or a[i] > b[i]: 
     counter += 1 

вы также может быть немного более умным и сделать что-то вроде:

for i in range(min(len(a), len(b)): 
    if a[i] > b[i]: 
     counter += 1 
if len(a) > len(b): 
    counter += (len(a) - len(b)) 

(Us ING xrange здесь будет незначительное улучшение, а)

+0

Это действительно хороший ответ, короткий и легкий для понимания. Благодарю. – Dider

-1

Вы можете перемещаться по парам, как так:.

for x, y in zip(a,b): 
    # if x > y... 

Остальные могут быть решены так же, как вы описали, путем проверки длины:

counter += len(a) - len(b) if len(a) > len(b) else 0 
1

Использование izip_longest из itertools. Это работает для двух списков, которые не имеют одинаковой длины.

In [47]: 2>None 
Out[47]: True 

Поскольку вам нужно проверить, что это прекрасно работает.

In [35]: from itertools import izip_longest 

In [37]: lst=list(izip_longest(a,b)) 

In [38]: lst 
Out[38]: [(1, 2), (3, 4), (4, 0), (2, None)] 

In [42]: mylst=[(i>j) for (i,j) in lst] 

In [44]: c=Counter(mylst) 

In [45]: c[True] 
Out[45]: 2 
+0

«Нет», возможно, не очень хорошая идея, если начальное целое число равно 0. Лучше это должно быть отрицательное число. поэтому нужно использовать 'fillvalue = -1' – gabhijit

+0

@gabhijit Спасибо – Ajay

2

Один из способов сделать это было бы:

len([_ for (i, j) in zip(a, b) if i > j]) + max(len(a) - len(b), 0)

+1

Почему бы не' len ([_ for (i, j) ... '; не использовать для генерации кортежей, нет? –

+0

Это не так точно печатать:) –

+0

Отличный ответ в любом случае. –

0

Использование itertools.izip_longesthttps://docs.python.org/2/library/itertools.html#itertools.izip_longest, подсчета числа ситуаций, когда больше, чем Ь, и использовать значение заполнения для Ь, которое меньше, чем минимально возможный а. Это приведет к простейшему возможному потоку управления и самому разборчивому коду. Стреляйте, вы можете заставить bools с ints суммой, как здесь: sum(a > b for a, b in itertools.izip_longest(a_list, b_list, fillvalue=-1)).

+0

Ааа жалко не видел этого, когда я написал ответ! – gabhijit

0

Я думаю, вам просто нужно добавить еще одно условие, чтобы проверить, является ли я 'значение меньше, чем список размеров B

for i in range(len(a)): 
    if i < len(b) and a[i] > b[i]: 
     counter += 1 
1

Простой Oneliner использованием itertools.izip_longest

import random 
import itertools 
l1 = [random.randint(1,20) for x in range(20)] 
l2 = [random.randint(1,20) for x in range(25)] 
sum([1 if y < x else 0 for (x,y) in itertools.izip_longest(l1, l2, fillvalue=random.randint(1,20)]) 

Здесь в случае длины списки не идентичны, izip_longest будет генерировать случайные числа снова, чтобы заполнить оставшиеся значения (но после перечитывания вашего вопроса - кажется, более правильным является fillvalue=-1). В основном вы можете использовать любое числовое значение там (или что-нибудь, что можно сравнить с int, если списки имеют целые типы).

+0

Я думаю, что один из них более изящный, но менее явный (это сумма значений «True», где значение «True» равно 1). – gabhijit

Смежные вопросы