• Как спарсить файл .doc python?

    @PavelMos
    Можно регулярными выражениями. Выражение ищет фразу от diff до цифрвой комбинации до первого "doc"
    https://regex101.com/r/XLJ1t4/1
    import re
    import urllib
    regexp1='(\/diff\/\d{1,2}-\d{1,2}.?doc)'
    f=urllib.request.urlopen('http://1311.ru/info/info.php') #открывает, возвращает объект http (не текст)
    b=f.read() #читает из него в bytes
    text=b.decode() #из bytes в utf-8 (кодировка по умолчанию, поэтому в аргументах декод можно не писать) переводит в текст
    out=re.findall(regexp1, text)
    #далее, зная адрес сайта
    for i in out:
       print ("http://1311.ru"+i)
    http://1311.ru/diff/16-09.doc
    http://1311.ru/diff/17-09.doc

    Но тут, вероятно, надо брать самое новое расписание, тогда их надо сортировать по датам, разделяя дату и месяц, или проверять каким-то образом дату файла на сервере
    Ответ написан
    2 комментария
  • Пройтись по многомерному массиву очередно?

    @PavelMos
    Через остаток от деления
    0%3, 1%3, 2%3, 3%3, 4%3, 5%3
    Out[79]: (0, 1, 2, 0, 1, 2)


    for i in range(len(comp)*len(comp[0])): #число всего элементов в 2-мерном массиве
        print (i%3)
        
    0
    1
    2
    0
    1
    2
    Ответ написан
    Комментировать
  • Как работает магический метод __hаsh__ в питоне при создании словаря?

    @PavelMos
    Имхо навряд ли это с ним связано потому что при списке всё ок. Со словарём может быть проблема если последующий ключ равен предыдущему, тогда он его перезаписывает.
    [(user.email,user.name) for user in (jane, joe)]
    Out[26]: [('jdoe@example.com', 'Jane Doe'), ('jdoe@example.com', 'Joe Doe')]
    [(user,user.name) for user in (jane, joe)]
    Out[33]: 
    [(<__main__.User at 0x1614587a390>, 'Jane Doe'),
     (<__main__.User at 0x1614587a1d0>, 'Joe Doe')]

    UPD
    но
    {joe:joe.name, jane:jane.name}
    Out[46]: {<__main__.User at 0x1614587a1d0>: 'Jane Doe'}
    Ответ написан
    4 комментария
  • Почему не сохраняются значения из цикла?

    @PavelMos
    Потому что это не цикл перебора индекса списка с шагом (for i in range.....), а цикла перебора самих элементов списка, где в i записывается очередной элемент
    Ответ написан
    Комментировать
  • Как сделать проверку в БД значений и по этим значениям сделать вывод пользователю?

    @PavelMos
    Как сделать проверку через IF/ELSE или другим оператором(может CASE)
    Зачем нужно сравнение в SQL если выбор номера группы происходит в питоне? Если это про питон, то в нём нет case, вместо него if..elif..elif..else
    result = cursor.fetchall()
    for x in result :
        if x == (2222,): # зачем запись (2222,) ?  Это тупла (неизменяемый список) из одного элемента, он не равен числу 2222
            print(x)
        else:
            print ("ops")
    Ответ написан
    Комментировать
  • Перекодировка в Python, как кратко записать?

    @PavelMos
    decode есть встроенная функция, но она не для строки, а для типа bytes, поэтому в начале нужно указать b'

    b'\xd0\x94\xd0\xb0, \xd0\xbf\xd1\x82\xd0\xb8\xd1\x86\xd1\x8b \xd0\xbe\xd0\xbf\xd0\xb0\xd1\x81\xd0\xbd\xd1\x8b "'.decode()
    Out[106]: 'Да, птицы опасны "'

    по умолчанию тут похоже utf-8, поэтому параметры в скобках можно не писать.
    Ответ написан
    Комментировать
  • Python Pandas, как вычислить среднее с подсчетом повторов одновременно?

    @PavelMos
    Так ведь в этой программе новый столбец в датафрейме не создаётся. Чтобы создать нужно ему дать имя:
    df['newcol']=...какие-то действия...

    Далее, среднее от чего ? Если от Value то оно будет 75/4=18,75 т.е. это будет прописано в каждой строке в новом столбце ?
    Тогда просто
    df['mean1']=df['Value'].mean() # значение mean пропишется в каждой строке столбца


    UPD колонка пропадает потому что pandas вероятно берёт в результат только указанную колонку Symbol и ко всем остальным цифровым применяет агрегатную функцию , в данном случаем mean(). Оставлять другие текстовые колонки в результирующем наборе было бы бессмысленно т.к. часть строк из них при группировке по Symbol просто пропадёт.

    Относительно добавления сразу двух столбцов - можно посмотреть "pandas add multiple columns". Можно например так
    df['a'], df['b']=list1,list2 #оба списка по длине равны длине колонки


    но с учётом того, что в этой же строке нужно посчитать count() и прописать соответствующее значение в строки с каждым соответствующим значением Value получится довольно громоздкая конструкция.
    df.groupby(['Name']).size()
    Out[95]: 
    Name
    Igrek    1
    Iks      2
    zet      1
    dtype: int64


    Затем создать соответствие элемент/число вхождений, и по этому соответствию прописать цифры в новом столбце по каждой строке
    df.groupby(['Name']).size().index.tolist()
    df.groupby(['Name']).size().tolist() 
    d=dict( zip (df.groupby(['Name']).size().index.tolist(), df.groupby(['Name']).size().tolist() ) )
    d
    Out[98]: {'Igrek': 1, 'Iks': 2, 'zet': 1}
    Ответ написан
    Комментировать
  • Ошибка в парсере питона. game не определена(((что тут не так?

    @PavelMos
    1) Создавайте вопрос с отформатированным текстом программы, чтобы были видны отступы
    2) BD создаётся как пустой словарь. Далее идёт перебор ключей BD. Но в словаре нет никаких элементов, соответственно переменная game, в которой должно быть значение очередного перебираемого ключа, не определена.
    Big_dict = {}
    BD = {}
    shits1 = []
    
    for game in BD.keys():
        for play in BD[game].keys():
    Ответ написан
    Комментировать
  • "Программа" для записи и показа паролей на Python, как исправить ошибки?

    @PavelMos
    lines = f.readlines()
    lines[int(numb)] = name + ' - ' + parol + '\n'

    Строки читаются в список строк, при добавлении нового пароля программа обращается к списку по индексу, которого там нет. Нельзя взять список x=[1,2,3,9,10] и добавить в нему новый элемент выражением x[6]=20 (но так можно добавить новый элементы в словарь, или перезаписать значение в словаре или списке).
    Добавить в список это append или extend.
    Если пароли добавляются под номерами, нужно потом эти номера считывать с учётом того, что номер пароля может быть не равен индексу строки.

    И еще желательно пользоваться средой, которая показывает, в какой строке в каком месте ошибка. Это условие вообще нужно включить в правила создания вопроса на сайте.
    Ответ написан
    Комментировать
  • Как вывести все содержимое файла?

    @PavelMos
    то же самое можно укоротить:

    with open('g.txt', 'r') as f: 
        print(f.read())


    или
    with open('g.txt', 'r') as f: print(f.read())
    Ответ написан
    Комментировать
  • Как составить запрос для выборки из базы по одинаковым значениям двух столбцов?

    @PavelMos
    groupby having count
    после count не должно быть пробела
    добавлять столбец "c" со счётчиком необязательно
    см. также sql aggregate functions multiple clause / sql агрегирование несколько условий
    upd без group by (id) запрос нормально не будет выполнятся, но почему, не знаю.

    SELECT *, COUNT(*) as C 
    FROM table1 
    GROUP BY (id)
    HAVING COUNT(country)>1 AND COUNT(name)>1
    Ответ написан
    2 комментария
  • Заменить окончания через JS?

    @PavelMos
    Можно же без регекспов
    var str1 = 'Зеленая поляна';
    re1='ная';
    re2='яна';
    var str_new = str1.replace(re1, 'ную');
    var str_new=str_new.replace(re2,'яну');


    Можно для падежей также https://morpher.ru/ использовать.
    Ответ написан
    2 комментария
  • Почему питон игнорирует первое значение списка?

    @PavelMos
    for sum in list- это перебор элементов списка по-порядку
    mult = mult + list[sum] это обращение к элементу списка по индексу. Первый элемент это 1, значит по индексу это будет уже второй, потому что нумерация идёт с нуля.

    sum = sum+1 - нет смысла, это значение будет сбрасываться в начале цикла, потому что там перебор sum из списка
    Ответ написан
    2 комментария
  • Как удалить строки из таблицы, которые повторяются в другой таблице?

    @PavelMos
    преобразовать датафреймы в списки, точнее в формат двухмерного массива, т.е. список списков, и сделать лист компрехеншн с условием, потом преобразовать обратно с теми же названиями столбцов что были.

    new_list=[x for x in df1.values.tolist() if x not in df2.values.tolist()]
    df3=pandas.Dataframe.from_records(data=new_list, columns=df1.columns.values())
    df3
    Out[217]: 
      col1  col2  col3
    0    A     1     5
    1    B     2     6
    2    D     4     8
    3    C     3   102


    Или как выше написали через объединение в самих датафреймах. Смотря что быстрее будет работать
    Ответ написан
    1 комментарий
  • Объясните, почему не пропускает код?

    @PavelMos
    Проверку условия можно короче сделать - не сравнивать с обоими сторонами, а сравнить только с меньшей

    if diametr<min(a,b):
        result='YES'
    else result='NO'
    Ответ написан
    Комментировать
  • Можно ли в словаре хранить ссылку на хранение?

    @PavelMos
    На stackexachange предлагают делать через функцию - в словаре в значение ключа для каждой переменной своя функция, которая просто возвращает переменную. Обращаться к значению в словаре нужно будет с добавлением () после

    def ret_a():
        return a
    a='xxx'
    ret_a()
    Out[161]: 'xxx'
    a='zzz'
    ret_a()
    Out[163]: 'zzz'
    d={'a':ret_a}
    d['a']()
    Out[164]: 'zzz'
    a='bbb'
    d['a']()
    Out[166]: 'bbb'


    Если сделать просто универсальную функцию def f(x): return(x), то сама она будет корректно возвращать текущее значение переменной, но через словарь значение изменяться не будет:
    def ret(a):
        return(a)
    b=1000
    ret(b)
    Out[175]: 1000
    d2={'a':ret(b)}
    d2
    Out[180]: {'a': 1000}
    b=9999
    ret(b)
    Out[182]: 9999
    d2
    Out[183]: {'a': 1000}
    Ответ написан
    Комментировать
  • Как заполнить структуру данными?

    @PavelMos
    В этом списке разные данные нужно по разному же разбирать. Если ключ:значение regNum и maxPrice можно брать при переборе i - если i[0]==regNum то записывать data['regNum']=i[1], то соотносить номер в number и название в name нужно по их порядку. Как-то отдельно выбрать все элементы i, у которых i[0]=='number', затем все, у которых i[0]=='name', затем пройтись по двум спискам
    list1=[1,2,3]
    list2=['Apples','Bananas','Oranges']
    list3=list(zip(list1,list2))
    #[(1,'Apples'),(2,'Bananas')...]
    #сформировать список для lots
    lots=[{'number':i[0],'objects':{'name':i[1]}} for i in list3]
    #добавить список как элемент
    data['lots']=lots
    Out[353]: 
    [{'number': 1, 'objects': {'name': 'Apples'}},
     {'number': 2, 'objects': {'name': 'Bananas'}},
     {'number': 3, 'objects': {'name': 'Oranges'}}]
    Ответ написан
  • Программа должна говорить Hello world, но выдаёт ошибку?

    @PavelMos
    1) оформите как код, чтобы было видно отступы
    2) в чем ошибка ? Код выполняется, команда "say..." в системе выполняется
    import os
    import sys
    import webbrowser
    words = "Hello world!"
    def talk(words):
        print(words)
    os.system("say " + words)
    talk(words)
    'say' is not recognized as an internal or external command,
    operable program or batch file.
    Hello world!
    Ответ написан
  • TypeError: cannot use a string pattern on a bytes-like object?

    @PavelMos
    cannot use a string pattern on a bytes-like object
    В data какие данные ? На всякий случай надо через type() посмотреть.
    Строка с регекспом должна применяться к тексту.
    Ответ написан
  • Как реализовать цикл удаление слов из строки в dataframe?

    @PavelMos
    1. Как записан населенный пункт в locality_name ? Если 'деревня Медвежья', то функция её не обработает, потому что if проверяет на совпадение с элементом списка целиком, а не деревню отдельно. Имхо проще не делать проверку дополнительную, а обрабатывать сразу всё подряд
    2. Нужно пробел/ы после удалённого слов/а убирать через lstrip или добавить пробел к словам в списке в регекспе,
    3. Добавить варианты Деревня, Город, Посёлок

    wordlist = ['Посёлок','Поселок','поселок','посёлок','городской','городского','типа','деревня','Деревня']
    
    def locality_id(row):
        name_id = row['locality_name']
        name_id = re.sub('(' + '|'.join(wordlist) + ')','',name_id).lstrip()
        return name_id
    
    
    for idx, row in df1.iterrows():
         print ('cell=', df1.loc[idx, 'locality_name'])
         df1.loc[idx, 'locality_name']=new_cell
         new_cell=locality_id(row)
         print ('new_cell=',df1.loc[idx, 'locality_name'])
    Ответ написан
    Комментировать