Как найти, сколько значений делится на определенное значение в 2d-массиве в Python

#python #arrays #random

#python #массивы #Случайный

Вопрос:

Следующий код генерирует случайное число 2d-массивов, и я хочу напечатать, сколько значений в каждой паре делится на 3. Например, предположим, что у нас есть массив [[2, 10], [1, 6], [4, 8]]. Итак, первая пара, которая равна [2,10], имеет 3, 6 и 9, которые равны 3, а вторая пара имеет 3 и 6, которые равны двум, а последняя пара [4,8] имеет только 1, делимый на 3, что равно 6. Следовательно, окончательный вывод должен выводить сумму общего числа делимых значений, которая равна 3 2 1 = 6

 a=random.randint(1, 10)

b = np.random.randint(1,10,(a,2))
b = [sorted(i) for i in b]   
c = np.array(b)            
   
counter = 0;   
  
for i in range(len(c)): 
    d=(c[i,0],c[i,1])
    if (i % 3 == 0):  
        counter = counter   1
print(counter)
  

Комментарии:

1. Вы имеете в виду, что [2, 10] , [1, 6] и [4, 8] являются интервалами , и вы хотите вычислить, сколько целых чисел в каждом интервале делится на 3?

2. ДА. Это правильно

Ответ №1:

Один из способов — подсчитать, сколько целых чисел в интервале делится на 3, проверяя каждое из них.

Другой способ, и это намного эффективнее, если ваши интервалы огромны, — использовать математику.

Возьмите интервал [2, 10] .

2 / 3 = 0.66; ceil(2 / 3) = 1 .

10 / 3 = 3.33; floor(10 / 3) = 3 .

Теперь нам нужно подсчитать, сколько целых чисел существует между 0,66 и 3,33, или подсчитать, сколько целых чисел существует между 1 и 3. Эй, это звучит ужасно похоже на вычитание! (и затем добавление одного)

Давайте запишем это как функцию

 from math import floor, ceil
def numdiv(x, y, div):
    return floor(y / div) - ceil(x / div)   1
  

Итак, учитывая список интервалов, мы можем назвать это так:

 count = 0
intervals = [[2, 10], [1, 6], [4, 8]]
for interval in intervals:
    count  = numdiv(interval[0], interval[1], 3)
print(count)
  

Или с использованием понимания списка и суммы:

 count = sum([numdiv(interval[0], interval[1], 3) for interval in intervals])
  

Ответ №2:

Вы можете использовать sum() встроенный для задачи:

 l = [[2, 10], [1, 6], [4, 8]]

print( sum(v % 3 == 0 for a, b in l for v in range(a, b 1)) )
  

С принтами:

 6
  

РЕДАКТИРОВАТЬ: Для подсчета количества идеальных квадратов:

 def is_square(n):
    return (n**.5).is_integer()

print( sum(is_square(v) for a, b in l for v in range(a, b 1)) )
  

С принтами:

 5
  

РЕДАКТИРОВАТЬ 2: Чтобы распечатать информацию о каждом интервале, просто объедините два примера выше. Например:

 def is_square(n):
    return (n**.5).is_integer()

for a, b in l:
    print('Pair {},{}:'.format(a, b))
    print('Number of divisible 3: {}'.format(sum(v % 3 == 0 for v in range(a, b 1))))
    print('Number squares: {}'.format(sum(is_square(v) for v in range(a, b 1))))
    print()
  

С принтами:

 Pair 2,10:
Number of divisible 3: 3
Number squares: 2

Pair 1,6:
Number of divisible 3: 2
Number squares: 2

Pair 4,8:
Number of divisible 3: 1
Number squares: 1
  

Комментарии:

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

2. Большое спасибо. что, если я хочу напечатать количество делимых и идеальный квадрат каждой пары без их суммирования. например, для первой пары выведите 3 2, где 3 — число делимых, а 2 — число совершенных квадратов.

3. Именно поэтому ответы только для кода не полезны новичкам. Научите человека ловить рыбу и еще много чего.

4. @user14263018 Смотрите мой EDIT2.

5. @user14263018 Вы, вероятно, имели в виду print('{}'.format(sum((v % 3 == 0) and is_square(v) for v in range(a, b 1)))) , что будет напечатано количество чисел, которые являются идеальными квадратами И делятся на 3.