Генерация последовательности чисел Python

Я хочу сгенерировать числовую последовательность, которая дважды повторяет 2 последовательных числа, затем пропускает число и повторяет последовательность в указанном диапазоне.

такой как

0,0,1,1,3,3,4,4,6,6,7,7 и так далее.

что у меня есть до сих пор

numrange = 10
numsequence  = [i for i in range(numrange) for _ in range(2)]
numsequence

который производит

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

что близко, но не совсем то, что я хочу

@NIKUNJPATEL ваша первая последовательность, как я написал в своем вопросе

Spooked 20.02.2023 12:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

[i+i//2 for i in range(2*(numrange+1)//3) for _ in range(2)]

Является одним из многих способов сделать это. Это, вероятно, ближе всего к вашей попытке.

Да, это так. На моем компьютере результат [0, 0, 1, 1, 3, 3, 4, 4, 6, 6, 7, 7, 9, 9, 10, 10, 12, 12, 13, 13].

chrslg 20.02.2023 12:53

Верно. Извините, моя ошибка. Тогда хорошее решение!

Yevhen Kuzmovych 20.02.2023 12:57

@chrslg это хорошо работает. Мне также нужна последовательность, чтобы остановиться на numrange. Я не понимал, что это также должно быть оговорено. Я думал, что это остановится на числе, вместо того, чтобы делать так много чисел

Spooked 20.02.2023 12:58

@Spooked, это остановится на numrange, если вы вместо этого используете range(numrange - 2) (или range(numrange - 3), если вам нужен эксклюзив)

Yevhen Kuzmovych 20.02.2023 13:01

@Spooked Исправлено так, что он дает все числа этого шаблона, которые меньше, чем numrange

chrslg 20.02.2023 13:01

Но это еще одна причина, по которой решение @YevhenKuzmovych более гибкое. Для любого повторяющегося паттерна легче разработать шаблон, а во-вторых, знать, когда остановиться :D

chrslg 20.02.2023 13:03

@chrslg спасибо за обновление. Вы можете объяснить, как работает //?

Spooked 20.02.2023 13:05
// — это просто целочисленное деление. a//b примерно такой же, как int(a/b). За исключением того, что int(a/b) выполняет деление с плавающей запятой, используя инструкцию ЦП с плавающей запятой и с неопределенностями с плавающей запятой (например, тот факт, что int(4 - 10*(2/10 + 1/10)) равно 0). Пока a//b используйте целочисленные инструкции. Но вне запутанных сфабрикованных примеров, сделанных для демонстрации различий, a//b имеет тот же результат, что и int(a/b). Итак, 10//2 равно 5. 13//2 равно 6. Следовательно, i+i//2 равно 0, когда i равно 0, 1, когда i=1, поскольку 1//2 равно 0,3, когда i=2, потому что 2//2=1. И т. д.
chrslg 20.02.2023 13:11
Ответ принят как подходящий

Вы можете перебирать числа с помощью шага 3:

[i + j for i in range(0, numrange, 3) for j in (0, 0, 1, 1)]

Выход:

[0, 0, 1, 1, 3, 3, 4, 4, 6, 6, 7, 7, 9, 9, 10, 10]

Ага, это другой способ. Вероятно, легче адаптироваться к другим шаблонам, чем к моему.

chrslg 20.02.2023 12:49

Хм, они сказали «в пределах досягаемости», а их собственная попытка использует range(numrange). Но ваш вывод показывает, что вы включаете 10, что не входит в диапазон.

Kelly Bundy 20.02.2023 15:57

@KellyBundy Это вопрос бизнес-логики, которую OP не указал. Мое решение предполагает инклюзивный диапазон. Чтобы сделать его эксклюзивным, мы просто использовали бы range(0, numrange - 1, 3) вместо этого, но это также исключило бы 3, 3, потому что иначе у 3 не было бы своего последовательного партнера (... повторяет 2 последовательных числа дважды ...).

Yevhen Kuzmovych 20.02.2023 16:04

Вы можете заставить свою работать, просто вставив if ~i % 3 (или if i % 3 < 2, но в чем прикол :-). Переформатировано для удобства чтения:

numrange = 10
numsequence = [
    i
    for i in range(numrange)
    if ~i % 3
    for _ in range(2)
]
print(numsequence)

Вывод (Попробуйте онлайн!):

[0, 0, 1, 1, 3, 3, 4, 4, 6, 6, 7, 7, 9, 9]

Другие вопросы по теме

Как написать программу, которая запрашивает у пользователя ввод от 1 до 20, но печатает «недопустимый ввод», если пользователь вводит какие-либо символы, строки или (-ve) целые числа?
Есть ли известная проблема с использованием .UsedRange для сброса диапазона в Excel, когда родителем является объект Worksheet?
Поиск Varbinary с минимальным и максимальным типом шаблона
Почему эти 2 сортировки противоположны по порядку
Oracle SQL — диапазон дат возврата с использованием MATCH_RECOGNIZE
Проверка и объединение перекрывающихся диапазонов
Можно ли при выборе диапазона JavaScript предотвратить выбор частичного узла?
В этом упражнении с обратным циклом диапазона не уверен, почему значение остановки равно -1, разве оно не должно быть 0 в этом упражнении с запуском, остановкой, шагом назад
Excel: подсчет вхождений текста в диапазоне, когда присутствуют два или более текстовых элемента
Найти корреляцию между двумя столбцами с данными диапазона