Как обрезать распакованный список списков до определенной длины? [дубликат]
В данной программе выводится последовательность чисел, которые повторяются столько раз сколько равны. Нужно обрезать ее до числа n. Пример, если n = 6, то последовательность должна выводиться: 1 2 2 3 3 3 Но у меня никак не выходит обрезать до этого числа
Отслеживать
задан 14 янв 2022 в 16:42
35 10 10 бронзовых знаков
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
n = int(input()) lst = [] i = 1 # для создания группы из i элементов, равных i while len(lst) < n: lst.extend([i] * i) i += 1 print(lst[:n])
Отслеживать
ответ дан 14 янв 2022 в 17:01
3,933 4 4 золотых знака 10 10 серебряных знаков 22 22 бронзовых знака
Тут два вопроса: как генерировать нужную вам последовательность чисел? Как из этой последовательности выделить кусок нужной длины?
import itertools # последовательность 1 2 2 3 3 3 4 4 4 4 . def gen(): for i in itertools.count(start=1): yield from itertools.repeat(i, i) # отрезаем первые n членов n = int(input()) print(*itertools.islice(gen(), n))
Если вы не хотите пользоваться itertools , то всё можно сделать вручную:
def gen(): j = 1 while True: for _ in range(j): yield j j += 1 def slice(seq, n): i = 0 for j in seq: if i == n: break yield j i += 1 n = int(input()) print(*slice(gen(), n))
Или можно всё собрать в кучу:
def gen(n): i = 0 j = 1 while True: for _ in range(j): if i == n: return yield j i += 1 j += 1 n = int(input()) print(*gen(n))
Как обрезать массив с обеих сторон в AHK?
Написал немого не то, что нужно, а исправить не получается.
Есть скрип, который режет строку по символу и выводит три элемента после второго, Но суть в том, что заранее неизвестно сколько элементов будет в середине, но известно, что всегда нужно убирать два спереди и три в конце.
То есть на питоне, к примеру, это выглядело бы так list[2:-3].
Вот код. подскажете, как переделать?
Строка пример: 1_2_3_4_5_6_7_8_9_10 => результат 3-4-5-6-7
str := Clipboard
strArr := StrSplit(str, "_")
new = % strArr[3] "-" strArr[4] "-" strArr[5] "-" strArr[6] "-" strArr[7]
Clipboard := new
return
- Вопрос задан 11 сент. 2023
- 38 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1
Не ИТ-специалист
И что сложного в этом общеалгоритмическом вопросе: вы не можете в цикле пройтись по массиву, вам на каждый чих нужна особая функция?
Ну, вызовите тогда для массива дважды метод RemoveAt (для удаления с конца при этом, вероятно, ещё потребуется использовать метод Length ).
Ответ написан 11 сент. 2023
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Автоматизация
- +1 ещё
Существуют ли аналоги AHK с нормальным диалектом?
- 1 подписчик
- 19 часов назад
- 19 просмотров
Как обрезать список в Python
Мне нужны первые 5 элементов. Если он имеет менее 5 элементов.
[4,76,2,8,6]
Как это сделать?
TIMEX 08 окт. 2009, в 02:39
Поделиться
Смотрите также: stackoverflow.com/questions/509211/…
Greg Hewgill 08 окт. 2009, в 00:25
Поделиться:
4 ответа
Лучший ответ
Вы просто субиндексируете его с помощью [:5] , указывающего, что вы хотите (до) первых 5 элементов.
>>> [1,2,3,4,5,6,7,8][:5] [1, 2, 3, 4, 5] >>> [1,2,3][:5] [1, 2, 3] >>> x = [6,7,8,9,10,11,12] >>> x[:5] [6, 7, 8, 9, 10]
Кроме того, если положить двоеточие справа от числа означает подсчет с n-го элемента вперед - не забывайте, что списки основаны на 0!
>>> x[5:] [11, 12]
Mark Rushakoff 08 окт. 2009, в 01:23
Индексы, срезы и итеративный обход — Python: Numpy-массивы
Массивы данных в Python можно разделить на два типа по наличию или отсутствию порядка элементов. Например:
- Множество set или словарь dict относятся к неупорядоченным данным — не удастся обойти их по индексу
- Зато такая возможность есть со списком list или кортежем tuple — у их элементов индексы есть
Для массивов numpy.ndarray порядок элементов важен, потому что он помогает ускорить обработку данных. Его индексация похожа на индексацию списка list . В этом уроке подробнее разберем эту тему, а также поговорим о правилах и методах работы с индексами массивов numpy.ndarray .
Правила индексирования массивов
Возьмем пример из прошлого урока и добавим к нему чуть больше данных:
# Импорт библиотеки numpy с псевдонимом np import numpy as np # Создание списка языка Python numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Конвертация созданного списка в массив Numpy numpy_numbers = np.array(numbers) # Тип созданного объекта numbers print(type(numbers)) # => # Тип созданного объекта numpy_numbers print(type(numpy_numbers)) # =>
Получим элемент массива numpy.ndarray . Здесь принцип такой же, как с получением элемента списка:
# Получение элемента по индексу из списка print(numbers[2]) # => 2 # Получение элемента по индексу из numpy.ndarray print(numpy_numbers[2]) # => 2
Отрицательные целые значения также применимы к индексации массивов numpy.ndarray :
# Получение элемента по отрицательному индексу из списка print(numbers[-1]) # => 9 # Получение элемента по отрицательному индексу из numpy.ndarray print(numpy_numbers[-1]) # => 9
В многомерном случае делается все по аналогии:
# Создание списка списков numbers_lists = [ [0, 1, 2,], [3, 4, 5,], [6, 7, 8,], [9, 10, 11] ] # Конвертация созданного списка списков в массив Numpy numpy_numbers_lists = np.array(numbers_lists) # Получение элемента по индексу из списка print(numbers_lists[2][1]) # => 7 # Получение элемента по индексу из numpy.ndarray print(numpy_numbers_lists[2][1]) # => 7 # Получение элемента по индексу из numpy.ndarray # Более предпочтительный способ print(numpy_numbers_lists[2,1]) # => 7
Выше мы рассмотрели два способа получения элементов массива. Лучше всего использовать последний, потому что он выполняется за меньшее время. Причины станут ясны дальше, после знакомства с операцией среза.
Операции среза данных
Операция среза — это удобный и распространенный способ получить некоторое подмножество элементов, идущих подряд. Срез помогает сократить время выполнения подвыборки за счет того, что не нужно использовать циклы:
Рассмотрим примеры срезов:
# Создание списка языка Python numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Конвертация созданного списка в массив Numpy numpy_numbers = np.array(numbers) # Срезы # Первые элементы списка print(numpy_numbers[:4]) # => [0 1 2 3] # Середина print(numpy_numbers[2:5]) # => [2 3 4] # Последние элементы списка print(numpy_numbers[-3:]) # => [7 8 9]
Срезы многомерных массивов упрощают операции со списками:
# Создание списка списков numbers_lists = [ [0, 1, 2,], [3, 4, 5,], [6, 7, 8,], [9, 10, 11] ] # Конвертация созданного списка списков в массив Numpy numpy_numbers_lists = np.array(numbers_lists) # Вырезание элементов из numpy.ndarray print(numpy_numbers_lists[:2,:2]) # => [[0 1] # [3 4]] # Попытка вырезать те же элементы из списка print(numbers_lists[:2][:2]) # => [[0, 1, 2], [3, 4, 5]] # Решение для вырезания элементов из списка print([row[:2] for row in numbers_lists[:2]]) # => [[0, 1], [3, 4]]
В примере выше мы вырезали элементы из верхнего левого квадрата исходной таблицы размером 2x2. Чтобы решить такую задачу с помощью списков, нужно было бы писать дополнительный код, тратить больше времени и сил.
Еще одна востребованная операция с многомерными массивами — получение строк и столбцов значений. Снова используем срезы массива numpy.ndarray и реализуем задачу таким образом:
# Создание списка списков numbers_lists = [ [0, 1, 2,], [3, 4, 5,], [6, 7, 8,], [9, 10, 11] ] # Конвертация созданного списка списков в массив Numpy numpy_numbers_lists = np.array(numbers_lists) # Вырезание 0 строки из numpy.ndarray print(numpy_numbers_lists[0,:]) # => [0 1 2] # Вырезание 0 строки — еще один способ print(numpy_numbers_lists[0]) # => [0 1 2] # Вырезание 1 столбца из numpy.ndarray print(numpy_numbers_lists[:,1]) # => [ 1 4 7 10]
Итеративный обход
Как мы говорили выше, в работе с массивами лучше не пользоваться циклами. Если есть возможность, лучше обходить элементы в нужном порядке с возможным периодическим пропуском элементов — так мы экономим время выполнения:
# Создание списка языка Python numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Конвертация созданного списка в массив Numpy numpy_numbers = np.array(numbers) # Четные элементы массива print(numpy_numbers[::2]) # => [0 2 4 6 8] # Обратный порядок элементов массива print(numpy_numbers[::-1]) # => [9 8 7 6 5 4 3 2 1 0]
Знак шага указывает на порядок обхода: плюс говорит о восходящем порядке обхода индексов, минус — об обратном. Значение шага задает период обхода. Аналогичный синтаксис применим и для многомерных массивов:
# Создание списка списков numbers_lists = [ [0, 1, 2,], [3, 4, 5,], [6, 7, 8,], [9, 10, 11] ] # Конвертация созданного списка списков в массив Numpy numpy_numbers_lists = np.array(numbers_lists) # Перестановка строк в обратном порядке print(numpy_numbers_lists[::-1]) # => [[ 9 10 11] # [ 6 7 8] # [ 3 4 5] # [ 0 1 2]] # Четные столбцы print(numpy_numbers_lists[. 2]) # => [[ 0 2] # [ 3 5] # [ 6 8] # [ 9 11]]
Закрепим знания на практике
Воспользуемся недельными данными по продажам сети магазинов:
| День | Магазин №1 | Магазин №2 | Магазин №3 | Магазин №4 |
|---|---|---|---|---|
| ПН | 7 | 1 | 7 | 8 |
| ВТ | 4 | 2 | 4 | 5 |
| СР | 3 | 5 | 2 | 3 |
| ЧТ | 8 | 12 | 8 | 7 |
| ПТ | 15 | 11 | 13 | 9 |
| СБ | 21 | 18 | 17 | 21 |
| ВС | 25 | 16 | 25 | 17 |
Подготовим данные для решения задач:
# Импортируем библиотеку numpy с псевдонимом np import numpy as np # Создаем «лист листов» продаж orders_values = [ [7, 1, 7, 8], [4, 2, 4, 5], [3, 5, 2, 3], [8, 12, 8, 7], [15, 11, 13, 9], [21, 18, 17, 21], [25, 16, 25, 17] ] # Конвертируем созданный «лист листов» в массив Numpy orders = np.array(orders_values)
А теперь пошагово выполним три задачи.
Задача 1. Оставить только первые два магазина:
# Оставляем только первые два магазина print(orders[. 2]) # => [[ 7, 1], # [ 4, 2], # [ 3, 5], # [ 8, 12], # [15, 11], # [21, 18], # [25, 16]]
Задача 2. Оставить в рассмотрении данные продаж за выходные дни:
# Оставляем в рассмотрении данные продаж за выходные дни print(orders[-2:]) # => [[21, 18, 17, 21], # [25, 16, 25, 17]]
Задача 3. Сделать обратный порядок дней в таблице:
# Делаем обратный порядок дней в таблице print(orders[::-1]) # => [[25, 16, 25, 17], # [21, 18, 17, 21], # [15, 11, 13, 9], # [8, 12, 8, 7], # [3, 5, 2, 3], # [4, 2, 4, 5], # [7, 1, 7, 8]]
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: