можно ли в питоне складывать списки
Создано: 28 мая 2025 г.
Создано: 28 мая 2025 г.
можно ли в питоне складывать списки
Да — но важно понимать, что «складывание» списков в Python бывает двух разных смыслов:
Что вы хотите сделать | Как это работает |
---|---|
Склеить (конкатенировать) два списка | Используйте оператор + или метод extend . <br><br>a = [1, 2] <br>b = [3, 4] <br>c = a + b # [1, 2, 3, 4] <br>a.extend(b) # a стало [1, 2, 3, 4] |
Повторить список несколько раз | Умножьте список на целое число. <br><br>[0] * 5 # [0, 0, 0, 0, 0] |
Сложить элементы попарно (1-й с 1-м, 2-й со 2-м и т.д.) | Обычный + не делает этого. Можно: <br>• через генератор: res = [x+y for x, y in zip(a, b)] <br>• через map : res = list(map(lambda xy: xy[0]+xy[1], zip(a, b))) <br>• или воспользоваться numpy /pandas , если нужны векторные операции. |
pythona = [10, 20, 30] b = [1, 2, 3] res = [x + y for x, y in zip(a, b)] print(res) # [11, 22, 33]
Если длины списков разные, zip
обрежет до короткого; чтобы «дополнить» отсутствующие элементы, используйте itertools.zip_longest
.
+
и *
работают с целыми списками (конкатенация и повтор).у меня есть объекты Obj, List[Obj], Obj
надо поместить все эти объекты в новый List[Obj], как это сделать?
Можно сделать это в одну‑строчку — c «распаковкой» списка:
pythonfrom typing import List obj1: Obj # первый объект objs: List[Obj] # список объектов obj2: Obj # второй объект new_list: List[Obj] = [obj1, *objs, obj2]
*objs
разворачивает (unpack
) все элементы существующего списка прямо внутрь литерала []
.obj1
, потом содержимое objs
, потом obj2
.python# через конкатенацию new_list = [obj1] + objs + [obj2] # пошагово new_list = [obj1] new_list.extend(objs) new_list.append(obj2)
Любой вариант даст тот же результат — выбирайте по стилю или читаемости.
def _chop(list: list, chunk_length: int):
return [list[i : i + chunk_length] for i in range(0, len(list), chunk_length)]
что делает этот код?
Этот маленький хелпер разбивает исходный список на «куски» фиксированной длины и возвращает список таких кусков.
pythondef _chop(lst: list, chunk_length: int): return [lst[i : i + chunk_length] # взять срез от i (включ.) до i+chunk_length (не включ.) for i in range(0, len(lst), chunk_length)] # i = 0, chunk_length, 2*chunk_length, …
range(0, len(lst), chunk_length)
генерирует индексы 0, chunk_length, 2*chunk_length, …
пока не превысит длину списка.
Срез lst[i : i + chunk_length]
берёт подпоследовательность длиной chunk_length
, начиная с позиции i
.
У последнего куска длина может быть меньше, если элементов не хватит.
Списковое включение ([...]
)
собирает все такие срезы в новый список и сразу возвращает его.
python>>> _chop([1, 2, 3, 4, 5, 6, 7], 3) [[1, 2, 3], [4, 5, 6], [7]]
list
затеняет встроенный тип list
; лучше переименовать (например, lst
), чтобы не потерять доступ к самому типу.chunk_length
≤ 0, range
бросит ValueError
; обычно проверяют, что длина-шаг положительна.