Я хочу сгенерировать числовую последовательность, которая дважды повторяет 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]
что близко, но не совсем то, что я хочу
[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 это хорошо работает. Мне также нужна последовательность, чтобы остановиться на numrange. Я не понимал, что это также должно быть оговорено. Я думал, что это остановится на числе, вместо того, чтобы делать так много чисел
@Spooked, это остановится на numrange
, если вы вместо этого используете range(numrange - 2)
(или range(numrange - 3)
, если вам нужен эксклюзив)
@Spooked Исправлено так, что он дает все числа этого шаблона, которые меньше, чем numrange
Но это еще одна причина, по которой решение @YevhenKuzmovych более гибкое. Для любого повторяющегося паттерна легче разработать шаблон, а во-вторых, знать, когда остановиться :D
@chrslg спасибо за обновление. Вы можете объяснить, как работает //?
//
— это просто целочисленное деление. 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. И т. д.
Вы можете перебирать числа с помощью шага 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]
Ага, это другой способ. Вероятно, легче адаптироваться к другим шаблонам, чем к моему.
Хм, они сказали «в пределах досягаемости», а их собственная попытка использует range(numrange)
. Но ваш вывод показывает, что вы включаете 10
, что не входит в диапазон.
@KellyBundy Это вопрос бизнес-логики, которую OP не указал. Мое решение предполагает инклюзивный диапазон. Чтобы сделать его эксклюзивным, мы просто использовали бы range(0, numrange - 1, 3)
вместо этого, но это также исключило бы 3, 3
, потому что иначе у 3
не было бы своего последовательного партнера (... повторяет 2 последовательных числа дважды ...).
Вы можете заставить свою работать, просто вставив 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]
@NIKUNJPATEL ваша первая последовательность, как я написал в своем вопросе