Архив рубрики: Python

Python преобразовать список из [1, [2, 3], 4] в [1, 2, 3, 4]

Задача: преобразовать список из такого типа [1, [2, 3], 4]   в    [1, 2, 3, 4]

check_lst = [[[2]], [4, [5, 6, [6], 6, 6, 6]]]

def check(lst):
    check_bool = True
    out_lst = []
    copy_lst = list(lst)
    while check_bool:
        check_bool = False
        for i in copy_lst:            
            if isinstance(i, list):
                check_bool = True
                out_lst.extend(i)
            else:
                out_lst.append(i)
        if check_bool:
            copy_lst = list(out_lst)
            out_lst = []            
    return out_lst

print check(check_lst)

[2, 4, 5, 6, 6, 6, 6, 6]

Лучшее решение


def check(lst):
    'convert all elements in lst in one row'
    return sum(map(lambda a: check(a) if isinstance(a,(list)) else [a],lst),[])

Автор: Viktor

Python использование set с классом

Задача: создадим класс, создадим пустой set. Заполним set экземплярами созданного класса. Для примера пусть экземпляры будут случайным целым числом из диапазона 0-9. Теперь мы хотим удалить из set-а все экземпляры класса значения которых совпадают с «9» и «8»

Где это можно применить на практике? В gamedeveloping игра «Астероид», в set добавляем все летающие по экрану камни, пробегаемся по set-у и сверяем дистанцию между кораблем и камнями:
для этого вычисляем дистанцию между координатами центров фигур
>>> def dist(p, q):
>>>     return math.sqrt((p[0] — q[0]) ** 2 + (p[1] — q[1]) ** 2)
и вычитаем радиус корабля и радиус камня, если получившееся значение <= 0 значит столкновение, то добавляем экземпляр класса камень во временный set. После окончания обхода set-а с камнями - удаляем из этого set-а временный set (один или более камней при столкновении) и уменьшаем счетчик жизней кораблю.
>>> import random

>>> class A:
>>>     def __init__(self, a):
>>>         self.a = a
>>>     def __str__(self):
>>>         return («%s») % self.a
        
>>> st = set()
>>> for i in range(10):
>>>     st.add(A(random.randrange(0, 10)))

>>> print [str(x) for x in st]

['6', '5', '3', '8', '4', '9', '2', '9', '9', '8']

>>> temp = set()
>>> for x in st:
>>>     if str(x) == '9' or str(x) == '8':
>>>         temp.add(x)

>>> print [str(x) for x in temp]

['8', '9', '9', '9', '8']

>>> st.difference_update(temp)
>>> print [str(x) for x in st]

['6', '5', '3', '4', '2']

Автор: Viktor

Подчеркнутая защищенность

Инкапсуляция — одна из основ ООП. Мы договариваемся использовать только часть функциональности класса, а взамен получаем возможность работать с самыми разными типами, даже с теми, которые будут написаны после окончания работы над текущим кодом.

Компилируемые языки реализуют инкапсуляцию методом принуждения. Программист отмечает методы и поля как личные или защищенные, а компилятор играет в большого брата и проверяет что все используется в корректном контексте. На моей памяти война за способ использования private/protected минимум пару раз принимала нешуточный оборот. Читать

Инвайт для сайта по изучению языка Python

Инвайт для сайта по изучению языка Python в игровой форме с левелами и медальками. Мини — задачки представленные на этом сайте взяты оттуда. После решения задачки, можно посмотреть лучшие решения.

Автор: Viktor

Python tic-tac-toe крестики-нолики 3Х3

Классические крестики нолики 3Х3. Функция должна возвращать в случае выигрыша символ победителя «Х» или «О». Если ничья (draw) — «D». На вход функции подается подобный 2-мерный массив список. Если клетка не заполнена, то символ «.»

game_result = [
        u»OOX»,
        u»XXO»,
        u»OXX»]

>>> def check_win(game_result):

# Column and row checking
>>>     for i in range(3):
>>>         if game_result[i][0] == 

               game_result[i][1] == 
               game_result[i][2]:
>>>             return game_result[i][0]
>>>         if game_result[0][i] == 
               game_result[1][i] == 
               game_result[2][i]:
>>>             return game_result[0][i]
# Diagonal checking

>>>     if game_result[0][0] == 
           game_result[1][1] == 
           game_result[2][2]:
>>>         return game_result[1][1]
>>>     if game_result[2][0] == 
           game_result[1][1] == 
           game_result[0][2]:
>>>         return game_result[1][1]
>>>     return «D»

Автор: Viktor