Архив метки: 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

Инвайт для сайта по изучению языка 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

Python преобразование числа [0-999] в текст

Например преобразовать 310 => three hundred ten


Мое решение:

FIRST_TEN = [«zero», «one», «two», «three», «four», «five», «six», «seven», «eight», «nine»]

SECOND_TEN = [«ten», «eleven», «twelve», «thirteen», «fourteen», «fifteen», «sixteen», «seventeen», «eighteen», «nineteen»]

OTHER_TENS = [«twenty», «thirty», «forty», «fifty», «sixty», «seventy», «eighty», «ninety»]

HUNDRED = «hundred»

number = 310

res_n = «»
lst = list(str(number))

if len(lst) == 1:
    res_n = FIRST_TEN[int(lst[0])]
    
if len(lst) == 2:
    if int(lst[0]) == 1:
        res_n = SECOND_TEN[int(lst[1])]
    elif int(lst[0]) > 1:
        if int(lst[1]) == 0:
            res_n = OTHER_TENS[int(lst[0]) — 2]
        elif int(lst[1]) > 0:
            res_n = OTHER_TENS[int(lst[0]) — 2] + ' ' + FIRST_TEN[int(lst[1])]   

if len(lst) == 3:
    if int(lst[1]) == 0:
        if int(lst[2]) == 0:
            res_n = FIRST_TEN[int(lst[0])] + ' ' + HUNDRED
        elif int(lst[2]) > 0:
            res_n = FIRST_TEN[int(lst[0])] + ' ' + HUNDRED + ' ' + FIRST_TEN[int(lst[2])]
    elif int(lst[1]) == 1:
        res_n = FIRST_TEN[int(lst[0])] + ' ' + HUNDRED + ' ' + SECOND_TEN[int(lst[2])]
    elif int(lst[1]) > 1:
        if int(lst[2]) == 0:
            res_n = FIRST_TEN[int(lst[0])] + ' ' + HUNDRED + ' ' + OTHER_TENS[int(lst[1]) — 2]
        elif int(lst[2]) > 0:
            res_n = FIRST_TEN[int(lst[0])] + ' ' + HUNDRED + ' ' + OTHER_TENS[int(lst[1]) — 2] + ' ' + FIRST_TEN[int(lst[2])]

print res_n

three hundred ten

Решение от гуру:

def convert(i):
if i < 20:
result = 'zero,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen'.split(',')[i]
elif i < 100:
result = ',,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety'.split(',')[i//10]
if i % 10:
result += ' ' + checkio(i % 10)
elif i < 1000:
result = checkio(i // 100) + ' hundred'
if i % 100:
result += ' ' + checkio(i % 100)
return result

Автор: Viktor

Python нахождение наиболее часто встречающегося символа в тексте

Задача: нахождение наиболее часто встречающейся буквы в тексте (использование например в криптографии при дешифровке). Требуется:

  • ищем только буквы
  • нет зависимости от регистра ('a' и 'A' считаются одинаковой буквой)
  • ищем букву которая встречается максимальное количество раз
  • если таких букв несколько, то результат выдаем первую встречающуюся по алфавиту
Решение мое:

>>> dict = {}
>>> text = «AavvvddAsfgh»
>>> letters = map(chr, range(ord('a'), ord('z')))

>>> for ch in text:
>>>     ch_lower = ch.lower()
>>>     if ch_lower in letters:
>>>         if dict.has_key(ch_lower):
>>>             dict[ch_lower] += 1            
>>>         else:
>>>             dict[ch_lower] = 1            

>>> out = [key for key, value in dict.items() if value == max(dict.values())]
>>> out.sort()
>>> print out[0]
a
Решение от гуру:
для Python 3.3

>>> import string
>>> def out_chr(text):
>>>     return max(string.ascii_lowercase, 

                   key=lambda ch: text.lower().count(ch))

для Python 2.7
>>> import re
>>> from collections import Counter

>>> def out_chr(text):
>>>     text = «».join(re.findall(«w», text.lower()))
>>>     return Counter(text).most_common()[0][0]


Автор: Viktor