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

Python добавление разделителей разрядов в числах

Задача: имеем на входе строку, слова в которой разделены пробелом. Если в строке попадается число, то вставляем точки как разделители разрядов. На выходе нужно получить строку.

Например: text =

‘123456’ => ‘123.456’
‘333’ => ‘333’
‘9999999’ => ‘9.999.999’
‘123456 567890’ => ‘123.456 567.890’
‘price is 5799’ => ‘price is 5.799’
‘he was born in 1966th’ => ‘he was born in 1966th’

Читать

Python создаём словарь из двух списков

Задача: из двух списков получить словарь, где первый список ключи словаря, второй — значения

key_dict = [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000]
value_dict = ['I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M']
dict_out = {}

for x, y in zip(key_dict, value_dict):
    dict_out[x] = y

print dict_out

{1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L', 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'}

zip(key_dict, value_dict) создает список такого вида [(1, 'I'), (4, 'IV') …]

Автор: Viktor

Пример ускорения python используя ctypes

Один из вариантов ускорить выполнение кода Python — переписать медленный метод на язык C, с помощью ctypes можно подключать библиотеки написанные на C.
Ниже пример вызова C-метода и сравнение производительности.

1) Пишем метод (файл myfib.c)

unsigned long fib(unsigned long x)
{
if(x < 2) return x;
return fib(x-1) + fib(x-2);
}

2) Компилируем:

gcc -shared -Wl,-soname,myfib.so -o myfib.so -fPIC myfib.c

3) Вызываем из Python и сравниваем с функцией написанной на чистом python:

import ctypes
import timeit

fib = ctypes.CDLL('./myfib.so').fib
fib.restype = ctypes.c_long
fib.argtypes = (ctypes.c_ulong,)

print timeit.timeit('fib(32)', 'from __main__ import fib', number=1)

def pyfib(x):
if x < 2: return x
return pyfib(x-1) + pyfib(x-2)

print timeit.timeit('pyfib(32)', 'from __main__ import pyfib', number=1)

Результат:

0.0463268756866
1.08009696007

В итоге, за счет использования ctypes, мы получили ускорение в 23 раза.

Если использовать оптимизацию при компиляции, то можно получить большую производительность, для этого нужно указать ключ оптимизации:

gcc -O3 -shared -Wl,-soname,myfib.so -o myfib.so -fPIC myfib.c

Варианты ключей оптимизации:
-O1 — Базовая оптимизация
-O2 — GCC выполняет почти все поддерживаемые оптимизации, эта опция уменьшает как время компиляции так и время выполнения сгенерированного кода.
-O3 — Более сильная оптимизация, включает -O2 + некоторые дополнительные опции.

С учетом оптимизации -O3, мы получили такой результат:

0.023335695266
1.08294892311

Это быстрее в 46 раз чем на чистом python.

Тестировалось на ubuntu 12.10, python 2.7

Автор: D1VER
Дата публикации: 2013-12-16T05:21:00.001-08:00

MongoDB базовые функции под python ( pymongo )

MongoDB — документо-ориентированная система управления базами данных (СУБД) с открытым исходным кодом, не требующая описания схемы таблиц.

# coding: utf8

import pymongo

from pymongo import Connection
connection = Connection()

# Удалить БД, если она существует
connection.drop_database("test_database")

# Выбираем БД
db = connection.test_database
# либо: db = connection["test_database"]

# Удалить коллекцию
db.drop_collection('users')

# Добавление документов в колекцию 'users'
db.users.save( { 'name':'user 1', 'level':1 } )
db.users.save( { 'name':'user 2', 'level':2 } )
db.users.insert( { 'name':'user 3', 'level':3 } )

# Полное имя колекции
print db.users.full_name

# Получить все документы
for user in db.users.find():
print user

# Выбрать конкретные атрибуты
users = db.users.find({},{ 'login':1, 'name':1 })

# Получить один документ по условию
user = db.users.find_one({'name':'user 1'})

# Получить/установить значение
print user['level']
user['level'] = 7

# Сохранить документ
db.users.save(user)

# Удалить документ
db.users.remove(user)

# Установить значение в документе
db.users.update({ 'name':'user 2' }, { "$set": { 'level':5 } })

# Кол-во документов
print 'Count',db.users.count()
print 'Count lvl=2',db.users.find({'level':2}).count()

# Сортировка
for user in db.users.find().sort('level'):
print user
# в обратном порядке: .sort('level',pymongo.DESCENDING)
# Сортировка по нескольким атрибутам
db.users.find({}).sort( [('status',1),('level',-< span class="mi">1)] )

# Ограничение выборки, пропустить один документ и выбрать не более двух
for user in db.users.find().skip(1).limit(2):
print user

# Условия
for user in db.users.find().where('this.name == "user 2" || this.level>3'):
print user

# Выбрать неповторяющиеся записи
for user in db.users.distinct('level'):
print user

# Поиск регулярным выражением
import re
regex = re.compile('^us', re.I | re.U)
result = db.collection.find({ 'name':regex })

Автор: D1VER
Дата публикации: 2013-12-16T05:15:00.002-08:00

Python полезности для игры Астероид

Выход за границы области экрана
>>> self.pos[0] = (self.pos[0] + self.vel[0]) % WIDTH
>>> self.pos[1] = (self.pos[1] + self.vel[1]) % HEIGHT
pos — координаты центра движущейся фигуры

Увеличение скорости астероидов в зависимости от счета score
# increase rock's velocity using score
for rock in rock_group:
    for i in range(2):
        rock.vel[i] = rock.init_vel[i] + (rock.init_vel[i] * score * 0.03)
или
rock_vel[i] = rock_vel[i] * (1 + score / 3)

Столкновение спрайтов (p q — координаты центров сталкивающихся спрайтов, dist — расчет дистанции между спрайтами)
def dist(p, q):
    return math.sqrt((p[0] — q[0]) ** 2 + (p[1] — q[1]) ** 2) 

def collide(self, other_object):
        return dist(self.pos, other_object.pos) <= self.radius + other_object.radius

Автор: Viktor

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