MiheiSV
@MiheiSV
Любитель интересных и забавных технологий

Состоит список только лишь из единиц, или нет?

arr - неотсортированный список рандомных положительных значений в количестве n(большинство из которых - единицы), при чем они могут повторяться
Надо выяснить, состоит список только лишь из единичек, или там есть посторонний элемент. Необходимо найти достаточно быстрое решение. То, что написано ниже не подходит, нужно быстрее. Так же преобразование arr в set не подходит, как и сумма значений массива(если вдруг такие варианты были среди возможных)

arr = [a1,a2,...,an]
if arr.count(1) == len(arr):
    ...
else:
    ...


может я туплю, но ничего более путного не придумал
  • Вопрос задан
  • 582 просмотра
Пригласить эксперта
Ответы на вопрос 5
@Wispik
Писал в комментариях, напишу и как ответ
Попробуй отсортировать список и проверить первый и последний элемент, должно работать быстрее чем перебор
arr = [....]
sorted(arr)
if arr[0] == 1 and arr[-1] == 1:
    ...
Ответ написан
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
import random
import numpy as np

RANGE = 1000
data = np.ones(RANGE)
data[random.randint(0, RANGE)] = random.choice([1, 42])
data = list(data)

def check_ones1():
    result = True
    for im in data:
        if im != 1:
            result = False
            break
    return result

def check_ones2():
    return all(map(lambda x:x==1, data))

def check_ones3():
    return data.count(1) == len(data)

assert check_ones1() == check_ones2() == check_ones3()

print(check_ones1())

Если один элемент - не единица:
# False

%timeit check_ones1()
69.6 µs ± 779 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit check_ones2()
94 µs ± 936 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit check_ones3()
87.7 µs ± 633 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)


если все единицы:
# True

%timeit check_ones1()
93.5 µs ± 776 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit check_ones2()
124 µs ± 374 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit check_ones3()
86.9 µs ± 566 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
Ответ написан
Комментировать
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Я не знаю, кто тот гений, который ставил эту задачу, но видимо, весь вопрос в том, чтобы догадаться, что перебирать весь массив целиком не обязательно.
result=True
for x in arr:
   if x != 1:
       result=False
       break
Ответ написан
@PavelMos
Надо по скорости смотреть, что быстрее
можно попробовать через set это набор только уникальных значений, однако предполагается, что как минимум одна единица там должна быть - в условии сказано, что единиц большинство
res=True if len (set (arr) )==1 else False
скорость вариантов можно мерить, делая print t1=(datetime.datetime.now()) до и t2=datetime.datetime.now() после и потом print (t2-t1)
datetime модуль должен быть по умолчанию вроде установлен
Ответ написан
Viji
@Viji
Associate DevOps Engineer
Помучился... кажется самый питоновый код будет такой:

arr = [a1,a2,...,an]
y=next((x for x in arr if x!=1), False)
print("There are not only 1s in the array" if y else "There are only 1s in the array")


Может другие подтвердят, но он должен останавливаться на любой первой не единице?

Сергей Горностаев - вам )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы