Ответы пользователя по тегу Python
  • Как удалить символы из строки?

    @throughtheether
    human after all
    Надо удалить слэши и то, что находится между ними.
    Уточните, что именно вы хотите получить из строки
    /home/user/develop/user/project/protatypes/Hatredcopter.mp3

    Если нужный конечный результат - Hatredcopter.mp3, то не проще сделать так:
    >>> filename='/home/user/develop/user/project/protatypes/Hatredcopter.mp3'
    >>> if '/' in filename:
    	filename=filename[filename.rindex('/')+1:]
    >>> filename
    'Hatredcopter.mp3'

    И вообще говоря, более корректно, на мой взгляд, обрабатывать пути и имена файлов при помощи функций модуля os:
    >>> import os
    >>> filename='/home/user/develop/user/project/protatypes/Hatredcopter.mp3'
    >>> os.path.split(filename)
    ('/home/user/develop/user/project/protatypes', 'Hatredcopter.mp3')
    Ответ написан
  • Как сложить поэлементно два словаря в Питоне?

    @throughtheether
    human after all
    Python2.7:
    >>> Dictionary1 = {0: 'A', 1: 'B', 2: 'C',}
    >>> Dictionary2 = {0: 'A', 1: 'B', 2: 'C',}
    >>> max_key=max(Dictionary1.iterkeys())
    >>> {k1+k2*max_key:'%s%s'%(v2,v1) for k1,v1 in Dictionary1.iteritems() for k2,v2 in Dictionary2.iteritems()}
    {0: 'AA', 1: 'AB', 2: 'AC', 3: 'BB', 4: 'BC', 5: 'CB', 6: 'CC'}

    Если этот код не подходит, то уточните, что и зачем вам надо сделать. В частности, как соотносятся значение нового ключа и двух старых.
    Ответ написан
  • Какие есть библиотеки Python для работы с изображениями и видео файлами?

    @throughtheether
    human after all
    для обработки изображений Wand (MagickWand/ImageMagick), для видео MoviePy
    Ответ написан
    Комментировать
  • Почему задача решается неправильно?

    @throughtheether
    human after all
    Это условие:
    if coord1 + o > 7 or coord2 + o > 7 or coord1 + d > 7 or coord2 + d > 7 or coord1 + o < -1 or coord2 + o < -1 or coord1 + d < -1 or coord2 + d < -1:
                continue
    else:
        ...

    ,на мой взгляд, некорректно, оно отсекает правильные ответы и разрешает неправильные (H8 в примере с исходной клеткой B7). Я бы на вашем месте переписал тело цикла так:
    if 0<=coord1 + o<=7 and 0<=coord2 + d<=7:
            print(doska[coord1 + o][coord2 + d])
    if 0<=coord1 + d<=7 and 0<=coord2 + o<=7:
            print(doska[coord1 + d][coord2 + o])
    Ответ написан
  • Как заставить двигаться анимацию в tkinter?

    @throughtheether
    human after all
    Предположу, что анимации вы не наблюдаете из-за того, что координаты центров маятников у вас практически не изменяются (целая часть постоянна). Думаю, дело в функции final_calculations. Её код можете показать?

    UPD: в этом коде, конечно, прекрасно всё. Ошибка, думаю, кроется здесь (см. комментарий в последней строке):
    i = 0
    ...
    class Pendulum(object):
        def __init__(self):
            ...
            self.root.after(0, self.animation, i)
        def animation(self, i):
            i = i # полагаю, i всегда равно 0

    исправить предлагаю так (не самый лучший способ, но он предполагает минимальные изменения в коде):
    i = 0
    ...
    class Pendulum(object):
        def __init__(self):
            ...
            self.root.after(0, self.animation)
        def animation(self):
            global i

    Однако, учитывая, мягко говоря, неординарную структуру кода, возможно, придется исправить текст программы еще в некоторых местах.
    Ответ написан
  • Работа с анаграммами, как можно оптимизировать скрипт?

    @throughtheether
    human after all
    Функция возвращающая список анаграмм из заданного слова
    Рекомендую присмотреться к модулю itertools, в частности, функции permutations. Примерный код:
    import itertools
    def anagrams(word):
    	for permutation in itertools.permutations(word):
    		yield ''.join(permutation)
    
    for word in anagrams('car'):
        print(word)
    car
    cra
    acr
    arc
    rca
    rac

    В случае повторения букв в слове анаграммы тоже будут содержать дубли:
    >>> for word in anagrams('rar'):
    	print word
    rar
    rra
    arr
    arr
    rra
    rar

    Функция сравнивающая два списка и возвращающая совпадения
    Если я правильно понял, вы держите в памяти списки анаграмм и словарных слов и ищете (линейным поиском) их пересечение. Это, на мой взгляд, не вполне эффективно. Я бы поступил так:
    words=['car','arc','cat','map','toster']
    wordset=set(words)
    for word in anagrams('car'):
       if word in wordset:
            print ("word %s matched vocabulary" % word)

    Если и этого не хватит, то можно будет, на мой взгляд, подумать об использовании фильтров Блума.
    UPD: Как я понял, основная проблема в количестве анаграмм.
    Вводим слово
    Из введённого слова делаем анаграммы
    Вы можете с самого начала для каждого слова из словаря запомнить его 'отсортированный' вариант:
    words=['car','arc','cat','map','toster']
    sortedwordset=set(''.join(sorted(w)) for w in words)
    >>> sortedwordset
    set(['acr', 'eorstt', 'amp', 'act'])
    Тогда для каждого введенного слова можно проверить, имеет ли смысл составлять анаграммы:
    if ''.join(sorted(word)) in sortedwordset:
        #continue with anagrams

    UPD2: Можно, на мой взгляд, сделать так: для каждого слова из словаря формируется его 'отсортированная' форма. Эта форма будет ключом словаря, а значением - список словарных слов, являющихся анаграммами этой формы. Тогда за счет предварительных вычислений можно будет быстро искать словарные анаграммы:
    def sorted_string(s):
    	return ''.join(sorted(s))
    
    words=['car','arc','cat','map','toster']
    d={}
    for word in words:
    	sorted_word=sorted_string(word)
    	if sorted_word in d:
    		d[sorted_word].append(word)
    	else:
    	    d[sorted_word]=[word]
    >>> d
    {'acr': ['car', 'arc'], 'eorstt': ['toster'], 'amp': ['map'], 'act': ['cat']}
    >>> d.get(sorted_string('car'),[])
    ['car', 'arc']
    >>> d.get(sorted_string('cat'),[])
    ['cat']
    >>> d.get(sorted_string('perkele'),[])
    []
    Ответ написан
  • Как сохранить форматирование текста при записи в файл?

    @throughtheether
    human after all
    for line in f:
        read = f.readline()
        split = read.split()

    Если я правильно понял, то строки пропускаются здесь. Вы итерируете по строкам файла (for line in f) и зачем-то каждый раз в цикле считываете новую строку (f.realine()), пропуская текущую. Python 2.7, например, в таком случае порождает исключение (ValueError: Mixing iteration and read methods would lose data).

    Я бы на вашем месте исправил на:
    for line in f:
        split = line.split()
    Ответ написан
  • Как найти совпадение в списке python?

    @throughtheether
    human after all
    Нужно выделить все подсписки, которые подходят под [1,2,*] без перебора списка.
    Если вы хотите выбрать все элементы первого уровня вложенности ("подсписки"), удовлетворяющие условию, без рассмотрения каждого из них (без перебора), то никак. В случае, если список a большой, вы можете рассматривать каждый элемент при добавлении его в список a и, в случае выполнения условия, добавлять его (или его индекс) в другой список/множество, хранящий/хранящее совпадения. Общая "сложность" будет такой же, но она, при соответствующей организации кода, будет "размазана" во времени, что иногда может быть предпочтительно. Но в таком случае паттерн должен быть известен заранее.
    Ответ написан
    Комментировать
  • Python работа с Excel. как установить xlutils?

    @throughtheether
    human after all
    Если возможно подскажите похожие плагины для работы с xl в Python 3.4

    openpyxl
    Ответ написан
    Комментировать
  • Как спарсить значение src из html кода?

    @throughtheether
    human after all
    При помощи selenium:
    from selenium import webdriver
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00%2Frev'
    xpath='//a[@id="pv_open_original"]'
    browser = webdriver.Firefox()
    browser.get(url)
    print browser.find_element_by_xpath(xpath).get_attribute('href')
    browser.quit()

    При помощи requests и lxml:
    import requests
    import json
    import lxml.html
    
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00'
    r=requests.get(url)
    doc=lxml.html.fromstring(r.text)
    search_string=url[url.find('photo'):url.find('%2F')]
    xpath='//a[contains(@href, "%s")]' % search_string
    src=doc.xpath(xpath)[0].get('onclick')
    d = json.loads(src[src.find('{'):src.find('}}')+len('}}')])
    src=d['temp']['base']+d['temp']['z_'][0]+'.jpg'
    print src
    Ответ написан
    Комментировать
  • Что неправильно в коде?

    @throughtheether
    human after all
    Что этот код, по-вашему, должен делать? А что он по факту делает (т.е. что не нравится)?
    UPD:
    Ошибки кода:
    g.go('...') имя переменной g не объявлено, добавьте перед этой строкой g=grab.Grab()
    u = urllib.urlopen(src) имя переменной src не объявлено.
    Другие ошибки: xpath, скорее всего, неверный. То, что вы скопировали его из firebug/firepath, не гарантирует, что grab сможет его обработать. Скорее всего, браузер и grab видят немного разную страницу, это связано с обработкой javascript. Кроме того, мне (grab 0.4.13, pyton 2.7, windows 7) grab ругался, что метод xpath() более не поддерживается (deprecated).
    UPD2:
    рабочий код с использованием grab:
    import urllib
    import grab
    import json
    
    g=grab.Grab()
    url='https://vk.com/kostya__wolf?z=photo107790602_343297825%2Falbum107790602_00'
    search_string=url[url.find('photo'):url.find('%2F')]
    xpath='//a[contains(@href, "%s")]' % search_string
    g.go(url)
    src=g.doc.select(xpath).attr('onclick')
    d = json.loads(src[src.find('{'):src.find('}}')+len('}}')])
    src=d['temp']['base']+d['temp']['z_'][0]+'.jpg'
    urllib.urlretrieve(src,'bibit.jpg')
    Ответ написан
  • Что делает скприпт livestreamer-completion / twitch_channels.py?

    @throughtheether
    human after all
    Там же написано, составляет список каналов, на которые подписан пользователь, с целью использования для автодополнения команд в bash. Это реализовано путем составления запросов к API twitch.tv и обработки json-ответов. Или у вас есть более конкретные вопросы?
    Ответ написан
    Комментировать
  • Как парсить html страницы и его обрабатывать?

    @throughtheether
    human after all
    Держите отвратительный, кривой, но работающий код на python:
    from selenium import webdriver
    import time
    browser = webdriver.Firefox()
    url='http://vk.com/go_in_zp?z=photo-50824015_344878304%2Falbum-50824015_00%2Frev'
    browser.get(url)
    time.sleep(5) # this is bad
    img=browser.find_element_by_xpath('//a[@id="pv_photo"]/img')
    print img.get_attribute('src')
    browser.quit()

    вывод:
    http://cs624016.vk.me/v624016533/a226/owG51bJm59o.jpg

    Как этот код можно изменить:
    1) строку time.sleep(5) заменить на проверку нахождения элемента (ждем секунду, проверяем наличие элемента, если его нет, увеличиваем счетчик и продолжаем; при достижении счетчиком максимального значения - таймаут)
    2) заменить selenium на phantom.js (чтобы окно фаерфокса не появлялось)
    3) понять, что происходит при загрузке страницы браузером и имитировать это поведение при помощи requests.
    Третий путь, на мой взгляд, самый трудозатратный и самый многообещающий (в смысле скорости решения).

    UPD:
    решение при помощи requests:
    import requests
    from lxml.html import fromstring
    url='http://vk.com/go_in_zp?z=photo-50824015_344878304%2Falbum-50824015_00%2Frev'
    search_string=url[url.find('photo-')+len('photo-'):url.find('%2F')]
    r=requests.get(url)
    doc=fromstring(r.text)
    xpath='//a[contains(@onclick, "%s")]/img' % search_string
    print doc.xpath(xpath)[0].attrib['src']
    Ответ написан
    2 комментария
  • На каком языке писать демон для разбора XML?

    @throughtheether
    human after all
    Подскажите, на каком языке лучше реализовать демона для разбора огромного XML.
    Я разбирал только небольшие файлы, но если бы стояла задача разобрать большой XML, я бы начал с python/lxml. Ссылки по теме: 1, 2.
    Ответ написан
    1 комментарий
  • Как сохранять фото на питон?

    @throughtheether
    human after all
    Быстро и сердито на python 2.7:
    import requests
    url='https://pp.vk.me/c540104/c624218/v624218602/3321/uYVa4FQv_q0.jpg'
    filename='toster.jpg'
    response=requests.get(url)
    if response.status_code==200:
    	with open(filename,'wb') as imgfile:
    		imgfile.write(response.content)

    Если картинка большая, можно подумать об итерации по содержимому ответа.
    Ответ написан
    2 комментария
  • Какие есть американские сайты задач по программированию?

    @throughtheether
    human after all
    checkio, по-моему, делает украинско-американская команда.
    Ответ написан
    Комментировать
  • Как определить входят ли две переменные одновременно в один из 4ех списков или входят в разные?

    @throughtheether
    human after all
    Почему списки diamonds, hearts и spades содержат одинаковые строки? Я не понимаю, в чем проблема перебрать четыре списка и проверить вхождение карт в каждый из них. Пример:
    _flag=False
    for _list in (clubs,diamonds,hearts,spades):
        if first_card in _list and second_card in _list:
            _flag=True
            break

    P.S. это нужно для функции, которая будет циклически проверять совпадение мастей карт.
    Что значит 'циклически'? Сколько ожидается циклов? Почему нельзя реализовать карты в качестве экземпляров специализированного класса или named tuple и напрямую сравнивать атрибуты?
    Ответ написан
    9 комментариев
  • Как происходит кеширование строк в Python?

    @throughtheether
    human after all
    С числами вроде разобрался - кешируется [-5, 256], но насчет строк нашел только скудные "кешируюутся короткие строки". Хотелось бы узнать более конкретно условия кеширования.
    В этом докладе (с 9 минуты) говорится, что, как правило, кэшируются строки длины в 1 байт и пустая строка. Думаю, это зависит от имплементации интерпретатора/VM.
    Также интересно, что такое "interned strings"?
    В моем представлении, это и есть кэшированная строка. Есть встроенная функция intern, возвращающая интернированный (кэшированный) вариант строки. Пример:
    >>> sys.version
    '2.7.6r3 Stackless 3.1b3 060516 (default, Apr 11 2014, 15:44:48) [MSC v.1500 32 bit (Intel)]'
    , короткие строки кэшируются автоматически:
    >>> s1==s2
    True
    >>> s1="toster"
    >>> s2="toster"
    >>> id(s1)==id(s2)
    True
    , длинные - нет:
    >>> s3="ticking away the moments that make up a dull day"
    >>> s4="ticking away the moments that make up a dull day"
    >>> s3==s4
    True
    >>> id(s3)==id(s4)
    False
    , но их можно кэшировать принудительно:
    >>> s5=intern("you fritter and waste the hours in an off-hand way")
    >>> s6=intern("you fritter and waste the hours in an off-hand way")
    >>> s5==s6
    True
    >>> id(s5)==id(s6)
    True
    >>>
    Ответ написан
    2 комментария