Как я могу поместить несколько слов в .split?
Мне нужно как-то добавить несколько слов в
.split \ Как я могу это сделать?

user_msg = "{0}".format(message.text)
user_msg.split("/message ")[1]

Чтобы оно распозновало
/Message и
/message

В сплит никак. Можно взять регулярные выражения:
<code>
import re
user_msg = re.split('/[mM]essage ', user_msg)
</code>


попробуйте так:

res = df.loc[df["Date"].dt.month == 2]

альтернативное решение - создание виртуального столбца и поиск по нему:

res = df.assign(mon=df["Date"].dt.month).query("mon == 2")


Помогите разобраться с функциями
Есть две функции:
Listo1() и
Listo2(). Каждая содержит свой список. Вопрос: Почему Listo1 благополучно возвращает свой список, в то время как Listo2 - нет?

def Listo1():
    a = []
    a.extend([1,2,3])
    return a

Listo1()

def Listo2():
    a = []
    for i in range(5):
        a.append(lambda x, i=i: i ** x)
    return a

Listo2()(2)

Лямбда - это функция, а не значение.
<code>
func = lambda x, i: i ** x

def Listo2():
    a = []
    for i in range(5):
        a.append(func(5, i))
    return a

print(Listo2())
</code>


Поиск подстрок в строке
Есть ли в python встроенные инструкции, которые позволяют осуществлять поиск подстрок в строке?
Строка:
Попробуй этих чудесных и спелых фруктов. Попробуешь?
Хочу найти:
Поп
Должен получить:
[0, 43]. Т.е. индексы всех вхождений в строку.

Можно использовать алгоритм Кнута-Морриса-Пратта
<code>
def find_all(source, sub):
    def prefix_func(s):
        pr = [0] * (len(s))
        for i in range(1, len(s)):
            k = pr[i - 1]
            while k > 0 and s[k] != s[i]:
                k = pr[k - 1]
            if s[k] == s[i]:
                k = k + 1
            pr[i] = k
        return pr

    result = prefix_func(sub + "$" + source)  # вместо доллара может быть любой другой не встречаюшийся символ
    return [index for index, element in enumerate(result) if (element >= len(sub))]
</code>
Работать будет за линейное время от суммарных длин строк. Если вы хотите искать часто по одной строке, то кажется надо будет написать алгоритм Ахо-Корасика.


Вопрос про установку файлов с сайта для Python
Нужно, чтобы с сайта устанавливался файл в папку с игрой(например в skyrim). Но проблема в том, что  у людей папка с игрой может находиться в любом месте, в любой их директории, куда они установили игру. Подскажите пожалуйста, как в этом случае поступить. Если что-то не понятно могу объяснить( пишу сразу не надо писать про автосоздание новой папки, мне это не нужно, так как файлы игры не будут в ней). Заранее спасибо!

Здесь достаточно перенести .py файл в директорию с игрой, чтобы он действовал непосредственно в локальной директории игры.


Аналог php pack в python?
В php операцияя
base64_encode(pack('n', 250) равна APo=
В python
base64.b64encode(pack('<H',250)) равна +gA=
В питон использую struct. Что я делаю не так?

Порядок байтов надо поменять с '<' на '>'
<code>
base64.b64encode(pack('>H',250))
</code>


Как добавить множество виджетов в QScrollArea
Я в питоне новичек как и в PyQT5, извиняюсь если вопрос глупый: Как добавить множество виджетов (в моем случае картинок) в
QScrollArea по возможности с
QGridLayout как в коде:

import sys
from PyQt5 import QtWidgets, QtGui

class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        self.imageColors = QtGui.QPixmap("colors.jfif").scaled(450 , 450)
        self.imageTreeNight = QtGui.QPixmap("treeNight.jpg").scaled(450 , 450)
        self.imageAbstract = QtGui.QPixmap("abstract.jfif").scaled(450 , 450)
        self.imageWoodWall = QtGui.QPixmap("woodWall.jfif").scaled(450 , 450)
        self.imageSign = QtGui.QPixmap("sign.jpg").scaled(450 , 450)
        self.imageLeaves = QtGui.QPixmap("leaves.jpg").scaled(450 , 450)

        self.labelColors = QtWidgets.QLabel()
        self.labelTreeNight = QtWidgets.QLabel()
        self.labelAbstract = QtWidgets.QLabel()
        self.labelWoodWall = QtWidgets.QLabel()
        self.labelSign = QtWidgets.QLabel()
        self.labelLeaves = QtWidgets.QLabel()

        self.labelColors.setPixmap(self.imageColors)
        self.labelTreeNight.setPixmap(self.imageTreeNight)
        self.labelAbstract.setPixmap(self.imageAbstract)
        self.labelWoodWall.setPixmap(self.imageWoodWall)
        self.labelSign.setPixmap(self.imageSign)
        self.labelLeaves.setPixmap(self.imageLeaves)

        self.layout = QtWidgets.QGridLayout()
        self.layout.addWidget(self.labelColors, 0 , 0)
        self.layout.addWidget(self.labelTreeNight, 0 , 1)
        self.layout.addWidget(self.labelAbstract, 1 , 0)
        self.layout.addWidget(self.labelWoodWall, 1 , 1)
        self.layout.addWidget(self.labelSign, 2 , 0)
        self.layout.addWidget(self.labelLeaves, 2 , 1)

        self.setLayout(self.layout)

if __name__ == "__main__":
    application = QtWidgets.QApplication([])

    window = Window()
    window.setWindowTitle("Window")
    window.setFixedSize(900, 900)
    window.show()

    sys.exit(application.exec_())

Нужно ту сетку с виджетами-картинками поместить на виджет, а его поместить в QScrollArea через метод QScrollArea:setWidget.
Пример:
<code>
import sys
from PyQt5 import QtWidgets, QtGui

class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.imageColors = QtGui.QPixmap("colors.jfif").scaled(450 , 450)
        self.imageTreeNight = QtGui.QPixmap("treeNight.jpg").scaled(450 , 450)
        self.imageAbstract = QtGui.QPixmap("abstract.jfif").scaled(450 , 450)
        self.imageWoodWall = QtGui.QPixmap("woodWall.jfif").scaled(450 , 450)
        self.imageSign = QtGui.QPixmap("sign.jpg").scaled(450 , 450)
        self.imageLeaves = QtGui.QPixmap("leaves.jpg").scaled(450 , 450)

        self.labelColors = QtWidgets.QLabel()
        self.labelTreeNight = QtWidgets.QLabel()
        self.labelAbstract = QtWidgets.QLabel()
        self.labelWoodWall = QtWidgets.QLabel()
        self.labelSign = QtWidgets.QLabel()
        self.labelLeaves = QtWidgets.QLabel()

        self.labelColors.setPixmap(self.imageColors)
        self.labelTreeNight.setPixmap(self.imageTreeNight)
        self.labelAbstract.setPixmap(self.imageAbstract)
        self.labelWoodWall.setPixmap(self.imageWoodWall)
        self.labelSign.setPixmap(self.imageSign)
        self.labelLeaves.setPixmap(self.imageLeaves)

        # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        layout = QtWidgets.QGridLayout()
        layout.addWidget(self.labelColors, 0 , 0)
        layout.addWidget(self.labelTreeNight, 0 , 1)
        layout.addWidget(self.labelAbstract, 1 , 0)
        layout.addWidget(self.labelWoodWall, 1 , 1)
        layout.addWidget(self.labelSign, 2 , 0)
        layout.addWidget(self.labelLeaves, 2 , 1)

        scroll_widget = QtWidgets.QWidget()
        scroll_widget.setLayout(layout)

        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidget(scroll_widget)
        scroll_area.setWidgetResizable(True)

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(scroll_area)
        # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

        self.setLayout(self.layout)

if __name__ == "__main__":
    application = QtWidgets.QApplication([])

    window = Window()
    window.setWindowTitle("Window")
    window.setFixedSize(900, 900)
    window.show()

    sys.exit(application.exec_())
</code>


Создание вложенных данных в сериализаторе Django Rest Framework
возникла проблема при создании вложенных данных в сериализаторе Django Rest Framework. Я хочу, чтобы при передачи в
request.data полей «slug» и «schedules» создавалась запись в БД с этими данными + «author» равен
request.user.
Моя попытка:
models.py

class ShareLink(models.Model):
    slug = models.SlugField(blank=False)
    schedules = models.TextField(blank=False)
    author = models.OneToOneField(User, on_delete=models.CASCADE, blank=False)
    users = models.ManyToManyField(User, related_name='sharelinks_used', blank=True)
    views = models.IntegerField(default=0)
    is_deleted = models.BooleanField(default=False)

    def __str__(self):
        str = 'ShareLink: id: {}, slug: {}'.format(self.id, self.slug)
        return str

serializers.py

class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields = ('schedules', 'photos', 'is_deleted', 'is_banned')
...

class UserSerializer(serializers.ModelSerializer):

    profile = ProfileSerializer(
        many=False,
        read_only=True
    )

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email', 'profile')
...

class ShareLinkSerializer(serializers.ModelSerializer):

    class Meta:
        model = ShareLink
        fields = ('id', 'slug', 'schedules', 'author', 'users', 'views', 'is_deleted')

views.py

class ShareLinkCreate(APIView):

    def post(self, request):

        serializer = ShareLinkSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data(), status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Ошибка:
— Отправляю POST-запрос с form-data, где slug = "some slug", schedules = "some schedules".
Ответ:

{
    "author": [
        "This field is required."
    ]
}

Прошу помочь с данным вопросом. Заранее спасибо!

Делаем поле только для чтения и при создании нового экземпляра - прокидываем автора из контекста запроса.

class ShareLinkSerializer(serializers.ModelSerializer):
    author = serializers.ReadOnlyField()

    class Meta:
        model = ShareLink
        fields = ('id', 'slug', 'schedules', 'author', 'users', 'views', 'is_deleted')

    def create(self, validated_data):
        validated_data['author'] = self.context['request'].user
        return super(ShareLinkSerializer, self).create(validated_data)

Чтобы не заморачиваться с вьюхой(прокидывать контекст в сериализатор вручную) - можно использовать CreateAPIView:

from rest_framework import permissions, generics

class ShareLinkCreate(generics.CreateAPIView):
    serializer_class = ShareLinkSerializer

    # Разрешаем доступ только авторизованным,
    # т.к. при создании анонимным пользователем - в сериализаторе будет ошибка
    permission_classes = (permissions.IsAuthenticated,)


Вывод элемента списка [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 3 года назад.

                        Улучшить вопрос

<code>
list_ = ['Java', 'Python', 1, 2, 3]

del_name = input('Введите элемент, который хотите удалить  ')
for item in list:
    if item == del_name:
        list.remove(item)
        print('Вы удалили элемент: {0}'.format(item))

    else:
        pass
</code>

list_ = ['Java', 'Python', 1, 2, 3]
del_name = 'Java'
list_.remove(del_name) if del_name in list_ else print('Введенного значения нет в списке')
print(list_)
# ['Python', 1, 2, 3]

list_ = ['Java', 'Python', 1, 2, 3]
del_name = 'Jav'
list_.remove(del_name) if del_name in list_ else print('Введенного значения нет в списке')
print(list_)
# Введенного значения нет в списке
# ['Java', 'Python', 1, 2, 3]

list_ = [item for item in list_ if item != del_name] if del_name in list_ else print(
    'Введенного значения нет в списке')

# ===== Ну или while

list_ = ['Java', 'Python', 1, 2, 3]
del_name = 'Java'

if del_name in list_:
    while del_name in list_:
        list_.remove(del_name)
else:
    print('Введенного значения нет в списке')


Почему не хочет сокращать строку?
У меня есть строка, которую я хотел сократить, но также после неё поставить цифру, которая укажет сколько раз повторялись буквы подряд, но постоянно выводится [None, 0, 0, 0]. Что не так с этим скриптом???
<code>
import os; os.system('cls')

s = str(input('Введите строку\n> '))
r = [None]
c = 0

for i in s:
    if i != r[-1] and c != 0:
        r.append(i)
        с += 1
    elif i != r[-1] and c == 0:
        r.append(c)

print(r)
</code>
Пока оно должно выводить все элементы массива r, которую если сложить получится сокращенная строка.

Вы, похоже, сами себя запутали. На самом деле, пока буква одна и та же, надо тоько увеличивать счетчик, а все остальное делать при ее смене
<code>
s = str(input('Введите строку\n> '))
# добавляем первую букву
r = [s[0]]
c = 1

for i in s[1:]:
    # буква сменилась, записываем счетчик предыдущей и ее саму
    if i != r[-1] :
        r.extend([c, i])
        c = 1
    # та же буква, увеличиваем счетчик
    else :
        c += 1
# надо добавить счетчик последней буквы
r.append(c)
print(r)

ababbabbb
['a', 1, 'b', 1, 'a', 1, 'b', 2, 'a', 1, 'b', 3]
</code>


Не могу понять работу генератора списка
На странице расписано как найти все делители числа, вычислив простую факторизацию. Там указана вот эта функция.
Мне не понятна строка:
div = [d * p**e for d in div for e in range(r + 1)] из за двойного цикла.
Можно ли развернуть эту запись в несколько строк чтобы я мог провести трассировку и самостоятельно разобраться в работе.
P.S.Еще изучаю питон и некоторые хитрые семантические выверты мне не понятны.

def divisors(factors):
       div = [1]
       for (p, r) in factors:
           div = [d * p**e for d in div for e in range(r + 1)]
       return div

Данная строка не то что бы эквивалентна блоку ниже, но приносит тот же результат

div = []
for e in range(r+1):
    for d in div:
        div.append(d * p**e)

Конструкция, которую вы продемонстрировали, называется генератором списка. Используется таким образом:
Допустим, у нас есть список
arr_to_copy, элементы из которого надо перенести в новый список
result_array, умножив каждый из них при этом на
5

result_array = [eachElem*5 for eachElem in arr_to_copy ]

Разбирая ваш пример:

div = [d * p**e for d in div for e in range(r + 1)]

1) Квадратные скобки говорят о том, что тип данных переменной
div - это [] (list)
2) Внутри скобок описаны значения его переменных, а именно...
3)
for e in range(r+1) - итерируем range(r+1) для вычисления каждого элемента
div. Для этого используем значение
e
4) Далее, внутри итерации в пункте 3, итерируем
for d in div, таким образом организуя двойной цикл
5) В левой части скобок находится выражение, которому будет равен каждый элемент списка
div по порядку на каждом шаге итерации.
d * p**e
Надеюсь, я объяснил всё предельно ясно. Если у вас остались вопросы, задайте их в комментарии и я постараюсь ответить, отредактировав этот ответ.


Как преобразовать список целых чисел в одно целое число без использования строковых функций?
У меня есть список целых чисел, которые я хотел бы распечатать как одно целое число, но я не могу использовать функцию, связанную со строками

x_lst =[ 1, 4, 5 ,23, 34,4, 4 ,2,1,34,342 ]
print ( "".join(list(map(str, x_lst))))

desired output:

Желаемый результат:

 145233444213434234

Вышеуказанный скрипт преобразует каждое целое число в строку, а затем сливает их вместе, но я не могу использовать
str (). Есть ли другой способ преобразовать этот список в одно целое число без использования чего-либо, связанного со строками?

Можно вот так:
<code>
print(*x_lst, sep='')
</code>


Почему команда while работает в этом случае?
Код для решения задачки из ЕГЭ.
<code>
l = 0
m = 0
x = 126464
d = 0
while (m != 4) and (l != 13):
    x += 1
    d = x
    l = 0
    m = 0
    while d > 0:
        m += 1
        if d % 8 > 4:
            l = l + (d % 8)
        d = d // 8
    print(l)
    print(m)
print (x)
</code>

вы неправильно записываете условие

Программа должна завершить свою работу, когда переменная m будет равна
  4, а L будет равна 13

должно быть :

while not ((m == 4) and (l == 13)):

или, что тоже самое

while (m != 4) or (l != 13):


Задача на динамическое программирование Python
Не могу решить задачу. Неправильно считает минимальный путь. Можете подсказать где ошибка?
Вот условие задачи:
 В прямоугольной таблице N×M (в каждой клетке которой записано некоторое число) в начале игрок находится в левой верхней клетке. За один ход ему разрешается перемещаться в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). При проходе через клетку с игрока берут столько у.е., какое число записано в этой клетке (деньги берут также за первую и последнюю клетки его пути).
Требуется найти минимальную сумму у.е., заплатив которую игрок может попасть в правый нижний угол.

ifile = open('INPUT.txt')
outfile = open('OUTPUT.txt', 'w')
s = [int(i) for i in ifile.readline().split()]
n = s[0]#3
m = s[1]#4
price = []
c = [[0] * (m + 1) for i in range(n + 1)]

for i in range(1, n + 1):
    price.append([int(j) for j in ifile.readline().split()])

for i in range(1, n + 1):
    for j in range(1, m + 1):
        c[i][j] = price[i - 1][j - 1]

for i in price:
    print(i)

for i in range(1, n):
    for j in range(1, m):
        c[i][j] = min(c[i - 1][j], c[i][j - 1]) + c[i][j]

print(c[i][j])

input.txt:

3 4
1 1 1 1
5 2 2 100
9 4 2 1

В output.txt ответ
правильный ответ - 8
Помогите найти ошибку

Введение нулевых ячеек сослужило плохую службу. Проще заполнить первую строку и столбец отдельно кумулятивными суммами, у вас это не получается из-за того, что вверху или слева ноль. Стоило при отладке посмотреть на c, чтобы это заметить
<code>
price = []
for i in range(n):
    price.append([int(j) for j in ifile.readline().split()])

for i in range(1, n):
    price[i][0] += price[i - 1][0]
for i in range(1, m):
    price[0][i] += price[0][i - 1]

for i in range(1, n):
    for j in range(1, m):
        price[i][j] = min(price[i - 1][j], price[i][j - 1]) + price[i][j]

print(price[-1][-1])

>> 8
</code>


Сортировка списка списков строк в различном лексикографическом порядке
В недавно заданном вопросе зашла речь об обратной сортировке алфавитного порядка.
В именно этом случае вопрос решается просто - по числам изначально отсортировать наоборот, а потом развернуть результат в обратном порядке. Однако, вероятно, таким образом можно решить вопрос не всегда.
Мне показалось, что именно это обсуждение уже мало относится к теме вопроса, и его стоит выделить в отдельный.

Суть вопроса:
Есть некоторый набор данных:

data = [
  ('Ехал', 1),
  ('Грека', 3),
  ('Через', 1),
  ('Реку', 2),
  ('Видит', 1),
  ('В', 2),
  ('Реке', 1),
  ('Рак', 2),
  ('Сунул', 1),
  ('Руку', 2),
  ('За', 1),
  ('Греку', 1),
  ('Цап', 1)
]

Стоит задача: сначала отсортировать этот список по второму элементу (числу) в порядке убывания, а в случае совпадения числа - внутри группы отсортировать в обратном лексикографическом порядке.

Решение задачи о сортировке в прямом лексикографическом порядке сводится к одной строке:

sorted(data, key=lambda x: (-x[1], x[0]))

Конкретно эта задача также может быть решена в одну строку:

reversed(sorted(data, key=lambda x: (x[1], x[0])))
# или же
sorted(data, key=lambda x: (x[1], x[0]), reverse=True)

И это решение действительно даст правильный результат. Однако, не всегда можно обойтись простым разворотом списка (особенно если ключей сортировки больше двух, или же оба ключа - строки)
Обратная сортировка по числу задаётся с помощью унарного отрицания:
-key.
Есть ли подобная возможность для строк?

UPD
Ответ на вопрос из комментариев про
reverse=True:
В некоторых случаях использование этого атрибута не поможет, ровным счётом, ничем.
Входные данные:

data_hard = [
  ('Иванов', 'Сергей', 'Фёдорович'),
  ('Петров', 'Александр', 'Владимирович'),
  ('Иванов', 'Алексей', 'Евгеньевич'),
  ('Афанасьев', 'Артём', 'Григорьевич'),
  ('Иванов', 'Иван', 'Иванович'),
  ('Петров', 'Сергей', 'Викторович'),
  ('Петров', 'Сергей', 'Владимирович'),
  ('Пушкин', 'Александр', 'Сергеевич'),
  ('Иванов', 'Сергей', 'Петрович'),
  ('Гоголь', 'Николай', 'Васильевич'),
]

Задача:

Отсортировать список в прямом порядке по фамилиям. В случае совпадения фамилии отсортировать группу в обратном порядке по имени. В случае совпадение фамилии и имени отсортировать подгруппу в обратном порядке по отчеству.

Результат прямой сортировки:

>>> sorted(data_hard, key=lambda x: (x[0], x[1], x[2]))
[('Афанасьев', 'Артём', 'Григорьевич'),
 ('Гоголь', 'Николай', 'Васильевич'),
 ('Иванов', 'Алексей', 'Евгеньевич'),
 ('Иванов', 'Иван', 'Иванович'),
 ('Иванов', 'Сергей', 'Петрович'),
 ('Иванов', 'Сергей', 'Фёдорович'),
 ('Петров', 'Александр', 'Владимирович'),
 ('Петров', 'Сергей', 'Викторович'),
 ('Петров', 'Сергей', 'Владимирович'),
 ('Пушкин', 'Александр', 'Сергеевич')]

Результат обратной сортировки:

>>> sorted(data_hard, key=lambda x: (x[0], x[1], x[2]), reverse=True)
[('Пушкин', 'Александр', 'Сергеевич'),
 ('Петров', 'Сергей', 'Владимирович'),
 ('Петров', 'Сергей', 'Викторович'),
 ('Петров', 'Александр', 'Владимирович'),
 ('Иванов', 'Сергей', 'Фёдорович'),
 ('Иванов', 'Сергей', 'Петрович'),
 ('Иванов', 'Иван', 'Иванович'),
 ('Иванов', 'Алексей', 'Евгеньевич'),
 ('Гоголь', 'Николай', 'Васильевич'),
 ('Афанасьев', 'Артём', 'Григорьевич')]

Как видно, оба варианта не соответствуют поставленным условиям. Т.е. атрибут
reverse не всегда является актуальным решением для обратной сортировки строк.

В сложных случаях сортировать нужно в несколько проходов.
Аналогом

sorted(data, key=lambda x: (-x[1], x[0]))

работающим не только с числами, будет

sorted(sorted(data, key=lambda x: x[0]), key=lambda x: x[1], reverse=True)

или для лучшей читаемости

from operator import itemgetter

sorted(sorted(data, key=itemgetter(0)), key=itemgetter(1), reverse=True)

Upd
Пояснение:
Берем вашу таблицу

[('Иванов', 'Сергей', 'Фёдорович'),
 ('Петров', 'Александр', 'Владимирович'),
 ('Иванов', 'Алексей', 'Евгеньевич'),
 ('Афанасьев', 'Артём', 'Григорьевич'),
 ('Иванов', 'Иван', 'Иванович'),
 ('Петров', 'Сергей', 'Викторович'),
 ('Петров', 'Сергей', 'Владимирович'),
 ('Пушкин', 'Александр', 'Сергеевич'),
 ('Иванов', 'Сергей', 'Петрович'),
 ('Гоголь', 'Николай', 'Васильевич')]

И упорядочиваем ее по имени

[('Петров', 'Александр', 'Владимирович'),
 ('Пушкин', 'Александр', 'Сергеевич'),
 ('Иванов', 'Алексей', 'Евгеньевич'),
 ('Афанасьев', 'Артём', 'Григорьевич'),
 ('Иванов', 'Иван', 'Иванович'),
 ('Гоголь', 'Николай', 'Васильевич'),
 ('Иванов', 'Сергей', 'Фёдорович'),
 ('Петров', 'Сергей', 'Викторович'),
 ('Петров', 'Сергей', 'Владимирович'),
 ('Иванов', 'Сергей', 'Петрович')]

Заметьте, что записи с одинаковыми ключами (именами в данном случае) остались в прежнем порядке относительно друг друга, например, Иванов Сергей Фёдорович стоит раньше Петрова Сергея Векторовича. Это не совпадение, такое поведение гарантируется.
Теперь по фамилии в обратном порядке

data_hard.sort(key=itemgetter(0), reverse=True)

[('Пушкин', 'Александр', 'Сергеевич'),
 ('Петров', 'Александр', 'Владимирович'),
 ('Петров', 'Сергей', 'Викторович'),
 ('Петров', 'Сергей', 'Владимирович'),
 ('Иванов', 'Алексей', 'Евгеньевич'),
 ('Иванов', 'Иван', 'Иванович'),
 ('Иванов', 'Сергей', 'Фёдорович'),
 ('Иванов', 'Сергей', 'Петрович'),
 ('Гоголь', 'Николай', 'Васильевич'),
 ('Афанасьев', 'Артём', 'Григорьевич')]

И, опять же, Петров Александр Владимирович идет раньше Петрова Сергея Викторовича, как и в предыдущей таблице. Это значит что результаты предыдущей сортировки не пропали даром. И несмотря на то, что многие записи сменили порядок, потому, что порядок фамилий важнее порядка имен, те записи, порядок которых не нуждался в изменении остались на своих местах.
Это возможно благодаря тому, что алгоритм сортировки используемый в
sort и
sorted гарантированно устойчивый.

Еще одним (менее производительным) решением будет создание собственного класса-обертки, меняющего операнды сравнения местами.

from functools import total_ordering

@total_ordering
class Reverse:
    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        return other.value < self.value

    def __eq__(self, other):
        return other.value == self.value

sorted(data, key=lambda x: (Reverse(x[1]), x[0]))

Upd
Пояснение:

Reverse здесь играет ту же роль, что и минус для числел, т.е. является некоторой функцией
f такой, что

если
x < y, то
f(y) < f(x)
  если
x = y, то
f(y) = f(x)

И даже несмотря на то, что этот метод медленнее предыдущего (он использует больше вычислений требующих интерпретации), он все равно более поверхностный, нежели преобразование строки в массив отрицательных чисел, при этом гарантированно корректно работает с любыми типами корректно реализующими сравнение.


Как посчитать среднее значение по условию?
Есть таблица people в ней столбцы
ID,
Sex. Есть таблица
cars имеющая столбцыID
ID_person и
Price.
Как посчитать среднюю цену только для владельцев со значением
Seх = "м"?
Я пробовал взять все индексы:

result = data_people.Sex[data_people.Sex == 'м'].index.tolist()

Потом:

result2 = (data_cars.merge(data_people.Sex[data_people.Sex == 'м'].index ,left_on="ID_person", right_on="ID",suffixes=["", "_2"]).mean("Price") )

 ID      Name         Height   Weight          Sex
  1 Журавлёвa Ия       184      40              ж
  2 Пестовa Снежана    183      40              ж
  3 Исаков Андрей      184      41              м
  4 Зуевa Альбина      179      40              ж
  5 Горбунов Сергей    183      41              м

 ID  ID_person Model   Price
  0    5       LADA    100000
  1    2      Toyota   50000
  2    1      Toyota   600000
  3    3      Daewoo   65000
  4    4      Subaru   300000

Получить надо среднее значение от 100000 и 65000.
Как получить эту одну цифру?

Вариант 1:

In [9]: cars.merge(pers.rename(columns={"ID":"ID_person"})).groupby("Sex")["Price"].mean()
Out[9]:
Sex
ж    316666.666667
м     82500.000000
Name: Price, dtype: float64

Вариант 2:

In [10]: cars.merge(pers.query("Sex == 'м'").rename(columns={"ID":"ID_person"})).groupby("Sex")["Price"].mean()
Out[10]:
Sex
м    82500
Name: Price, dtype: int64


Проблема с программой, связанная с пустым окном. PyQt5
Проблема заключается в том, что я хотел написать программу у которой нет оконного режима(то есть нет поверхностного интерфейса, кнопки закрыть и свернуть) и мне это удалось сделать, но это окно теперь нельзя перетащить. Я воспользовался этим кодом:
<code>
class Widget(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.setupUi(self)

        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
</code>

или так
<code>
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

    def paintEvent(self, ev):
        painter = QtGui.QPainter(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setBrush(QtGui.QColor(195, 195, 255))
        painter.setPen(QtCore.Qt.NoPen)
        painter.drawRoundedRect(self.rect(), 10.0, 10.0)

    def mousePressEvent(self, event):                                      # <<<-----
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):                                       # <<<-----
        delta = QtCore.QPoint (event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())
</code>


Преобразовать матрицу в список кортежей Python
Дана матрица N*N, состоящая из 0 и 1. Необходимо преобразовать её в список кортежей длины N. Количество элементов в списке равно количеству единиц в матрице.

Например, [[0, 0, 0], [0, 0, 0], [0, 0, 1]] -> [(0, 0, 3)]

Как можно это реализовать на Python?

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

N=len(arr)
rezz=[]
for el in arr:
    s=el.count(1)
    rez=[0,0,0]
    for i,ell in enumerate(el):
        if ell==1:
            rez[i]=N
    for _ in range(s):
        rezz.append(tuple(rez))

и ее результаты для ваших контрольных случаев:

[[0, 0, 0], [0, 0, 0], [0, 0, 1]]
[(0, 0, 3)]

[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
[(3, 0, 0), (0, 3, 0), (0, 0, 3)]

[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
[(3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3)]

и еще один дополнительный

[[1, 1, 1], [1, 0, 1], [1, 1, 1]]
[(3, 3, 3), (3, 3, 3), (3, 3, 3), (3, 0, 3), (3, 0, 3), (3, 3, 3), (3, 3, 3), (3, 3, 3)]


как добавить элементы массива a в массив b?
Есть двумерный массив a:

[[3, 5, 6, 4],
[5, 5, 6, 7],
[9, 5, 4, 3]]

И массив b:

[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]

Необходимо совместить эти два массива, чтобы получилось что-то такое:

[[0, 0, 0, 0, 0],
[0, 3, 5, 6, 4],
[0, 5, 5, 6, 7],
[0, 9, 5, 4, 3]]

Как реализовать это на python?
Помогите пожалуйста


Совместить похожие элементы списка в одну строку
Решал задачу с codewars, вот что должна возвращать функция:

accum("abcd") -> "A-Bb-Ccc-Dddd"
accum("RqaEzty") -> "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy"
accum("cwAt") -> "C-Ww-Aaa-Tttt"

Вот мой код:
<code>
def accum(s):
lst = []
r = -1
b = []
for i in s:
    r += 1
    lst.append(i)
    b += lst[r] * r

a = '-'.join(b)

return a.title()
</code>
print(accum("ZpglnRxqenU"))
Функция возвращает строку и делит каждый символ знаком "-", как мне совместить повторяющиеся элементы?
P.S не ругайте за возможный велосипед, я новичек)

Начнем с того, что ваша функция "глотает" первый символ. Во-вторых она все выводит большими буквами. И в третьих -  зачем все так сложно?

def accum(s):
    a=""
    for i,elt in enumerate(s):
        a = a+"-"+elt.upper()
        for _ in range(i):
            a = a+elt.lower()
    return a[1:]
print(accum("ZpglnRxqenU"))

Результат:

Z-Pp-Ggg-Llll-Nnnnn-Rrrrrr-Xxxxxxx-Qqqqqqqq-Eeeeeeeee-Nnnnnnnnnn-Uuuuuuuuuuu

Другие контрольные прогоны:

print(accum("RqaEzty"))
R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy

print(accum("abcd"))
A-Bb-Ccc-Dddd

print(accum("cwAt"))
C-Ww-Aaa-Tttt

Небольшой костыль в последней строчке функции - return a[1:] -  позволяет избежать множества лишних проверок в цикле.


Проблема с tkinter в PyCharm Python
Всем добрый день. Работаю с Python с tkinter. Запускаю код в PyCharm, после чего выводит ошибку:

Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 908, in _find_spec
AttributeError: 'TransformFinderLoader' object has no attribute 'find_spec'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/PycharmProjects/main/main.py", line 1, in <module>
    import tkinter
  File "C:\Users\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 38, in <module>
    from tkinter.constants import *
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 910, in _find_spec
  File "<frozen importlib._bootstrap>", line 884, in _find_spec_legacy
  File "C:\Users\iljal\AppData\Local\Programs\Python\Python38-32\lib\site-packages\source_transform\meta_path.py", line 44, in find_module
    triggered_transforms = self.get_triggered_transforms()
  File "C:\Users\AppData\Local\Programs\Python\Python38-32\lib\site-packages\source_transform\meta_path.py", line 65, in get_triggered_transforms
    prot=mmap.PROT_READ
AttributeError: module 'mmap' has no attribute 'PROT_READ'

========================================================================================
Использую Python 3.8.2
Не понимаю в чем ошибка. Библиотеку уже устанавливал: pip install tkinter. Но если сейчас попробую ввести в командной строке "pip install tkinter", то выводит ошибку:

C:\Users>pip install tkinter
Could not import runpy module
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 908, in _find_spec
AttributeError: 'TransformFinderLoader' object has no attribute 'find_spec'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 910, in _find_spec
  File "<frozen importlib._bootstrap>", line 884, in _find_spec_legacy
  File "c:\users\appdata\local\programs\python\python38-32\lib\site-packages\source_transform\meta_path.py", line 44, in find_module
    triggered_transforms = self.get_triggered_transforms()
  File "c:\users\appdata\local\programs\python\python38-32\lib\site-packages\source_transform\meta_path.py", line 65, in get_triggered_transforms
    prot=mmap.PROT_READ
AttributeError: module 'mmap' has no attribute 'PROT_READ'

================================================================================================
А вот сам код, который пытаюсь запустить:

import tkinter

master = tkinter.Tk()
canvas = tkinter.Canvas(master, bg='white', height=600, width=600)
canvas.pack()
for i in range(1, 9):
    canvas.create_line((0, 600 / 8 * i), (600, 600 / 8 * i), fill='black')
    canvas.create_line((600 / 8 * i, 0), (600 / 8 * i, 600), fill='black')
master.mainloop()

И так с любым кодом, если есть слова: import tkinter.
Подскажите пожалуйста как решить это. Заранее большое спасибо!

Все у вас работает. Запускается поле с клеточками. Вам нужно правильно подключить tkinter  к проекту. Для этого, вы должны убедиться, что у вас подключена библиотека, через  file-->settings.  Там в списке должен быть pip и привязана к нему нужная вам библиотека. Если вы устанавливаете библиотеку через командную строку, то не факт что указанный в Пайчарм интерпретатор её подцепит. Для установки библиотек необхоимо использовать средства Пайчарм, описанные мной выше.


Есть ли в Python оператор строгого сравнения наподобие ===?
Просто обычное сравнение через
== работает не так, как нужно:

>>> 0 == False
True

Если суть вопроса в сравнении значений и типов, то можно сделать так:

def strict_eq(obj1, obj2):
    if type(obj1) != type(obj2):
        return False
    return obj1 == obj2

In [4]: strict_eq(0, False)
Out[4]: False

PS можно пойти ещё дальше и для числовых типов сравнивать числа до определенной точности, чтобы избежать известных проблем с плавающей точкой:

In [5]: 0.1 + 0.2 == 0.3
Out[5]: False

функция строгого сравнения с определенной точностью:

from numbers import Number

def strict_eq(obj1, obj2, epsilon=1e-7):
    if type(obj1) != type(obj2):
        return False
    if isinstance(obj1, Number):
        return abs(obj1 - obj2) < epsilon
    return obj1 == obj2

In [10]: strict_eq(0.1 + 0.2, 0.3)
Out[10]: True


Как работает кроссвалидация - cross_val_score?
Есть датасет, он разделен на признаки - X и на объеты - y. Есть модель - Ridge с настроенными гипер-параметрами. Я могу проверить точность предсказания этой модели с помощью функции cross_val_score?
<code>
X = dataset[['IW','IF','VW','FP']].values
y = dataset[['Depth','Width']].values

model_ridge = Ridge(alpha=[0.001])

results = cross_val_score(model_ridge, X, y, cv=4, scoring='r2')
results
# Выход: array([ 0.44374476,  0.39469688,  0.26293681, -0.05665834])

results.mean()
#Выход: 0.261180024048342
</code>
Получается качество этой модели 26 % ?
И правильно ли я понимаю как работает cross_val_score, а именно, что в она разбивает X и y на 4 части, обучает модель на 3/4 части и проверяет ее на 1/4 части?

правильно ли я понимаю как работает cross_val_score, а именно, что в
  она разбивает X и y на 4 части, обучает модель на 3/4 части и
  проверяет ее на 1/4 части?

Да, вы все правильно понимаете. Для cv=4 все именно так и работает.
Судя по результатам Cross-Validation, R^2 score очень сильно различается для разных частей датасета. И в вашем случае постоянно ухудшается. Вы можете попробовать перетасовать датасет перед тем как делать Cross-Validation.
Пример:
<code>
>>> from sklearn.model_selection import ShuffleSplit
>>> n_samples = X.shape[0]
>>> cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
>>> cross_val_score(clf, X, y, cv=cv)
</code>


Посоветуйте модуль для реагирования на нажатие клавиш
посоветуйте модуль для реагирования на нажатие клавиш. Я работал с модулем от tkinter (Canvas):
<code>
from tkinter import *
window = Tk()
c = Canvas(window)
c.pack()
def a():
    key = event.keysym
    if key == 'w':
        КАКОЙ-ТО КОД
c.bind_all("<KeyPress>", a)
window.mainloop()
</code>
Но он не может реагировать на нажатие нескольких клавиш одновременно, посоветуйте модуль, который может реагировать на нажатие нескольких клавиш одновременно, спасибо.

Если вам нужно реагировать на нажатия кнопок клавиатуры, вам может подойти модуль
keyboard
Устанавливается через pip (
pip install keyboard)
Примеры работы модуля: Пример 1, Пример 2


Найти нужное значение в словаре по одному ключу и отредактировать значение в другом ключе
у меня цикл for проходится по json и заполняет словарь

{'name': 'имя1', 'id': '378', 'number': ['+2', '+3', '+4', '+5', '+6', '+7', '+8', '+9', '+10', '+11', '+12']}
{'name': 'имя2', 'id': '18', 'number': ['+2', '+3', '+4', '+5', '+6', '+7', '+8']}
{'name': 'имя2', 'id': '18', 'number': ['+8', '+9', '+10', '+11', '+12']}
{'name': 'имя3', 'id': '428', 'number': ['+2', '+3', '+4', '+5']}

Если id и имя одинаковые, то склеиваем number
Мне подсказали тут конструкцию. Склеиваем? Должно выйти так

{'name': 'имя2', 'id': '18', 'number': ['+2', '+3', '+4', '+5', '+6', '+7', '+8', '+9', '+10', '+11', '+12']}

Но как сделать не могу понять.
Вот например цикл for проходится по json сверху вниз и заполняет словарь.
Если он наткнулся на id который уже есть в словаре, нужно найти строку с этим id, склеить поле number убрав дубли и не записывать дубль

new_dict = {'name': '', 'id': '', 'number': []}
Затем

for data in json_data['data']:
  id = int(data['attributes']['id'])
  number = data['attributes']['numbers']
  number_dict = {'number': number}

  if str(id) in new_dict['id']:
      new_dict['number'] = sorted(list(set(new_dict['number'] + number_dict['number'])), key=lambda x: int(x))
  else:
      new_dict['name'] = name
      new_dict['id'] = str(id)
      new_dict['number'] = number_dict['number']

Результат будет неверный. Короче я запутался и не могу пока понять как сделать это. Подскажите пожалуйста


Не понятен принцип срабатывания условного оператора if
Пытаюсь проверить, какое значение из словаря
cash соответствует ключу
'op':

cash = {'x': 0,
        'y': 0,
        'eq': 0,
        'op': '-'}

if cash['op'] == '+' or '+=':
    print('plus', cash)
elif cash['op'] == '-' or '-=':
    print('minus', cash)
elif cash['op'] == '*' or '*=':
    print('mult', cash)
elif cash['op'] == '/' or '/=':
    print('div', cash)
else:
    print('WTF?')

Получаю:
plus {'x': 0, 'y': 0, 'eq': 0, 'op': '-'}
Несмотря на то, что значение
'op' : '-', почему-то срабатывает условие
if cash['op'] == '+' or '+='.
Как исправить код так, чтобы проверка значения ключа
'op' работало корректно?

Уже давал недавно ответ на подобный вопрос.

Дело в том, что вы неправильно реализуете сравнение.
Операция
if cash['op'] == '+' or '+=': равносильна
if (cash['op'] == '+') or ('+='):, и если левый операнд
or изменяет своё значение, то правый - непустая строка, а булево представление непустых строк всегда истинно.
Получается операция
if [True/False] or True, что всегда равно
True.

Если вам нужно сравнивать значение сразу со многими, воспользуйтесь оператором вхождения
in:

cash = {'x': 0,
        'y': 0,
        'eq': 0,
        'op': '-'}

if cash['op'] in ('+', '+='):
    print('plus', cash)
elif cash['op'] in ('-', '-='):
    print('minus', cash)
elif cash['op'] in ('*', '*='):
    print('mult', cash)
elif cash['op'] in ('/', '/='):
    print('div', cash)
else:
    print('WTF?')


Как в tkinter включать программу сразу развернутой (maximize)
Я разрабатываю игру, и мне бы хотелось, чтобы окно игры сразу открывалось большим, развернутым

Если вам подойдёт окно на весь экран (перекрывает панель Windows):

from tkinter import *
window=Tk()
window.overrideredirect(1)
window.state('zoomed')

Если нужно оставить панель Windows и верхнюю полосу приложения:

from tkinter import *
window =Tk()
window.state('zoomed')


Работа со списками, словари
Здравствуйте передо мной стоит такая задача:

Создать список (библиотека книг), состоящий из словарей (книги).

Словари должны содержать как минимум 5 полей  (например, номер,
  название, год издания...). В список добавить хотя бы 10 словарей.

Создать список (библиотека книг), состоящий из словарей (книги).

Словари должны содержать как минимум 5 полей  (например, номер,
  название, год издания...). В список добавить хотя бы 10 словарей.
  Конструкция вида:
library = [{"id" : 123456, "title" : "Война и мир",

"author" : "Толстой",...} , {...}, {...}, ...].

Реализовать функции:

вывода информации о всех книгах;  – вывода информации о книге по
  введенному с клавиатуры номеру;  – вывода количества книг, старше
  введённого года;
обновлении всей информации о книге по введенному
  номеру;  – удалении книги по номеру.  Провести тестирование функций.

Вот так я попытался решить эту задачу :

library = [{"id": 12,\
            "title" : "В интересах революции",\
            "group" : "Агата Кристи"},\
            {"id": 13,\
            "title": "Серебро",\
            "group":"Би-2"},\
            {"id":14,\
            "title": "Люди на холме",\
            "group":"Наутилус Помпилиус"},\
            {"id": 15,\
            "title" : "Uselink",\
            "group": "Depeche Mode"}]

def listAll(x,lib):
    for i in range(len(library)):
        el = '{},{},{}'\
             .format( lib[i].get('id'),\
                      lib[i].get('title'),\
                      lib[i].get('group') )
        return el

def outByNums(x,lib):
    for i in range(len(library)):
        el_sym = lib[i].get('id')
        if int(x) is el_sym:
            el2 = '{},{},{}'\
                  .format( library[i].get('id'),\
                  lib[i].get('title'),\
                  lib[i].get('group') )
    return el2

def popByNums(x,lib):
    for i in range(len(library)):
        el_sym1 = lib[i].get('id')
        if int(x) is el_sym1:
            lib.pop(i)
    return lib

x_in = int(input())
print(popByNums(x_in,library))

Мой вопрос такой: если в функции popByNum( ) поиск i-го элемента проходит нормально и я даже могу вернуть его индекс, то когда я пользую свойство .pop(i) то происходит ошибка:

 File "task562.py", line 46, in popByNums
    el_sym1 = lib[i].get('id') IndexError: list index out of range

я не понимаю, почему такое происходит, и как вообще можно удалить элемент по этому индексу, неужели придется переводить список в еще один словарь и работать с ним ?

Вы удаляете книгу, список сокращается, а индекс и дальше идёт до старой длины списка.
Я бы изменил функцию следующим образом:
<code>
def popByNums(id, lib):
    for i, book in enumerate(lib):
        if id == book['id']:
            lib.pop(i)
            return lib
</code>
Т.е. сразу после нахождения нужной книги мы выходим из функции, и цикл не продолжает свою деятельность


Бинарные операторы в Python
Дискретную математику немного понимаю, но суть побитовых операторов в Python уяснить пока не получается совсем

Можно ли использовать побитовые операторы вместо логических:

& вместо
and

| вместо
or

Если нет, укажите, пожалуйста, предметную область в которой побитовые операторы станут незаменимы или очень уместны

Вы можете использовать битовые операции, если операндами являются булевы значения:

>>> True & False
False
>>> False & True
False
>>> False & False
False
>>> True & True
True

В таком случае всё верно, и ничего не нарушается. Однако в python пользователи часто используют булево представление объекта, не приводя его к булевому значению напрямую:

a = []
if a:
    print("Список не пуст")

В таком случае могут возникать исключения:

>>> a = []
>>> b = [1, 2, 3]
>>> a & b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'list' and 'list'
>>> a and b
[]
>>> a | b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'list' and 'list'
>>> a or b
[1, 2, 3]

Хуже того - в отдельно взятых случаях, вероятно, такая замена может не вызывать исключений, а приводить к вычислительным ошибкам:

>>> 3 & 4
0
>>> 3 and 4
4

По этой причине настоятельно рекомендую не уходить от принятых булевых операторов, если нет желания работать исключительно с булевыми выражениями напрямую:

>>> a = []
>>> b = [1, 2, 3]
>>> bool(a) & bool(b)
False
>>> bool(a) and bool(b)
False

Для булевых операндов попарно равносильны операции
and/
& и
or/
|


Задание по Python - с конфетами [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 3 года назад.

                        Улучшить вопрос

Задание: Дано вещественное число – цена 1 кг конфет. Вывести стоимость 1, 2, … 10 кг конфет. Решить задачу используя циклическую конструкцию for.
Нужна помощь, в чем проблема, я сделал, только совсем не тот ответ (и то с ошибками). Заранее благодарю.
<code>
un = float(input('КГ = '))
for i in range(1, 1.1 // 10):
    landungalia = i*un
print('{} кг стоит {}'.format(i, landungalia))
</code>

p = float(input())

for x in range(1, 11):
  print(x*p)


Добрый день! Есть поставлення задача. С чего начать советуєте? [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос закрыт, так как на Stack Overflow на русском вопросы принято задавать только на русском языке. Пожалуйста, переведите ваш вопрос на русский язык или воспользуйтесь Stack Overflow на английском.

Закрыт 3 года назад.

                        Улучшить вопрос

Create a function which takes as input two dicts with structure mentioned above, then computes and returns the total price of stock.
Input data:
stock = {
    "banana": 6,
    "apple": 0,
    "orange": 32,
    "pear": 15
}
prices = {
    "banana": 4,
    "apple": 2,
    "orange": 1.5,
    "pear": 3
}

Начните с азов языка.

Прочитайте про типы данных (числа, строки, списки, словари) и операции с ними
Прочитайте условные операторы и циклы (if ... else, for, while)
После этого уже без труда решите эту задачу.
Например, в цикле:

s = 0
for fruit in stock.keys():
    s += stock[fruit]*prices[fruit]
print(s)

Или генератором:

s = sum(stock[fruit] * prices[fruit] for fruit in stock.keys())


Как решить проблему с ботом ВК? Python
Есть бот в ВК, который парсит данные с сайта и отправляет их человеку.
Вот пример кода:

def main():
    file = open('token.ini', 'r')
    token = file.read()
    token = str(token.strip())
    file.close()
    vk_session = vk_api.VkApi(token=token, api_version=5.103)
    longpoll = VkLongPoll(vk_session)
    vk = vk_session.get_api()
    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
            if event.from_user:
                if event.text.lower() == 'начать':
                    vk.messages.send(
                        user_id=event.user_id,
                        message='Приветствую тебя, друг! Перед тобой появились кнопки для управления ботом воспользуйся ими!',
                        random_id=0,
                        keyboard=keyboard
                        )
                elif event.text.lower() == 'в меню':
                    vk.messages.send(
                        user_id=event.user_id,
                        message='Вы попали в меню!',
                        random_id=0,
                        keyboard=keyboard
                        )
                elif event.text.lower() == 'получить данные':
                    event_user_id = event.user_id
                    get_info
                else:
                    vk.messages.send(
                        user_id=event.user_id,
                        message='Я не понял твоей команды. Для начала работы с ботом напишите Начать.',
                        random_id=0
                        )

get_info отправляет пользователю картинку, так-же пример кода:

vk.messages.send(
            user_id=event_user_id,
            attachment=','.join(attachments),
            random_id=0,
            message=''
        )

attachments это список с приложенными картинками формата
[photo{owner_id}_{photo_id},и так далее]
И если написать боту "получить данные" все вроде в порядке, но после отправки картинки он 4 раза флудит текстом из
else: в функции
main как это исправить?

Вы вызываете функцию
get_info по ссылке без скобок в конце, что значит вы выполняете ее как процедуру, не отдавая на вход никаких параметров, и запускаете в отдельном процессе. Насколько мне известно, оно не захватывает данные из пространства функции, из которой была вызвана, а также не бросает ошибок, поскольку выполняется в другом процессе параллельно.
Я попытался воссоздать вашу программу и протестировать. С вашей проблемой я не столкнулся, но функция
get_info очевидно не работала. После того, как я передал функции все необходимые для работы аргументы, она заработала без ошибок. Получив изображения, я мог продолжать дальше пользоваться ботом без каких-либо проблем.

def get_info(vk, event_user_id):
    vk.messages.send(
                user_id=event_user_id,
                attachment=','.join("photoSOMEUID_SOMEMID"),
                random_id=0,
                message='test'
            )

...
#in main():
...
 elif event.text.lower() == 'получить данные':
                    event_user_id = event.user_id
                    get_info(vk, event.user_id)
...


Посчитать количество вхождений слов
ЗАДАЧА.

Строка на входе и которое возвращает слово, содержащее все уникальные слова в качестве ключей и количество вхождений в качестве значений

import string
<code>
text = 'A journey of a thousand miles begins with a single step.'

for c in string.punctuation:
    text = text.replace(c, ' ')

print(text)
</code>

Меня больше волнует, какой тут язык: "Строка на входе и которое возвращает слово, содержащее все уникальные слова в качестве ключей и количество вхождений в качестве значений import string"
Понять практически невозможно.  Строка, которая возвращает слово? Слово которое содержит все уникальные слова?
Но если я правильно догадался, то вот примерно так:

from collections import Counter
text = 'A journey of a thousand miles begins with a single step.'
list_text = text.lower().replace('.', '').split()
counts = Counter(list_text)
print(counts)

Получаем:

Counter({'a': 3, 'journey': 1, 'of': 1, 'thousand': 1, 'miles': 1, 'begins': 1, 'with': 1, 'single': 1, 'step': 1})


TypeError: 'int' object is not iterable при попытке посчитать нули в списке
Код:

def move_zeros(array):
    a = array.count(0)
    for i in a:
        array.remove(0)
        array.append(0)
    return array

Вопрос:
При попытке пересчитать количество нулей в списке array программа выдаёт ошибку:

for i in a:
TypeError: 'int' object is not iterable

a = array.count(0) # a - число. Количество нулей в массиве
for i in a: # у числа нет итератора
    # do smth

Если вам нужно
a раз пройти цикл, используйте функцию
range:

a = array.count(0) # a - число
for i in range(a):
    # do smth

А вообще для фильтрации нулей лучше воспользоваться функцией
filter:

>>> def cls(array):
...   count = array.count(0)
...   return list(filter(lambda x: x != 0, array)) + [0]*count
...
>>> cls([0, 1, 1, 2, 0, 3, 5, 0, 7, 2])
[1, 1, 2, 3, 5, 7, 2, 0, 0, 0]


Как отсортировать столбец по данным из другого столбца?
В таблице
cars есть столбец
ID_person - владельцев авто. Есть таблица
person, в ней столбецы
ID,
weight и
height. Задача, отсортировать таблицу
cars по Вес/рост владельца. Проблема в том, что размер таблицы person 20000 уникальных людей, а
cars - 15000 при этом у одного человека может и не быть машины или быть несколько.
Я пробовал создать столбец
w/h разделив столбец
Weight на
Height и отсортировать таблицу
people по столбцу
w/h с помощью
people.sort_values['w/h'] и пробовал отсортировать
cars так
cars.sort_values[people['ID']]. Но ничего не вышло.
Вот пример таблицы
cars:

 ID  ID_person Model
  0    3       LADA
  1    2      Toyota
  2    1      Toyota
  3    3      Daewoo
  4    4      Subaru

Вот пример таблицы people после сортировки по
w/h:

 ID      Name         Height   Weight          h_w
  5 Журавлёвa Ия       184      40    0.21739130434782608
  4 Пестовa Снежана    183      40    0.2185792349726776
  1 Исаковa Мария      184      41    0.22282608695652173
  2 Зуевa Альбина      179      40    0.22346368715083798
  3 Горбуновa Эдита    183      41    0.22404371584699453

Надо получить
cars в таком виде:

 ID, ID_person Model
  4    4      Subaru
  2    1      Toyota
  1    2      Toyota
  0    3       LADA
  3    3      Daewoo

попробуйте так:

res = (cars
       .merge(pers.eval("x=Weight/Height"),
              left_on="ID_person", right_on="ID",
              suffixes=["", "_2"])
        .sort_values("x")
        [cars.columns])

результат:

In [80]: res
Out[80]:
   ID  ID_person   Model
4   4          4  Subaru
3   2          1  Toyota
2   1          2  Toyota
0   0          3    LADA
1   3          3  Daewoo


Python3.8 добавить значения в ключ в dict
есть словари с такой структурой

{'test': 'привет' , 'numbers': ['6', '7', '8', '9', '10', '11', '12']}

и

{'numbers': ['2', '3', '4', '5', '6']}

Нужно сделать чтобы был такой результат:

{'test': 'привет' , 'numbers': ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']}

У меня пока выходит только так

{'test': 'привет' , 'numbers': ['6', '7', '8', '9', '10', '11', '12']['2', '3', '4', '5', '6']}

Т.е. нужно их соединить и убрать дубли. Что-то уже второй день голову ломаю, не могу разобраться. Помогите пожалуйста?


Python проблема: После двоеточие пишет invalid syntax и выделяет пустоту, что делать? [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 3 года назад.

                        Улучшить вопрос

На python
<code>
print("Змеиный калькуклятор v1.5")
what = input("Что делаем?(+,-,*,/.)")
e = 0
a = float ( input("Введи первое число:") )
b = float ( input("Введи второе число:") )
while e > 0:
    if e == 1:
        break
    if what == "+":
        c = a + b
        print("Результат:" + str (c))

    elif what == "-":
        c = a - b
        print("Результат:" + str (c))

    elif what == "*":
        c = a * b
        print("Результат:" + str (c))

    elif what == "/":
        c = a / b
        print("Результат:" + str (c))

    else:
        print("Выбрана неверная операция!")

    input ("Нажмите на C и Enter чтобы продолжить, нажмите на E и Enter чтобы выйти"):# Вот здесь выделяет пустоту и говорит SyntaxError: invalid syntax
        if "e":
            e + 1
        else:
            e + 0
</code>

Уберите двоеточие после вызова функции
input:

input ("..."):
#            ^

P.S.:
Далее в коде Вы не присваиваете никуда результат ввода (а также вычислений
e + 1,
e + 0), а условие
if "e" всегда истинно.


найти все следующие значения из списка при нахождении подстроки начиная со второго совпадения [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 3 года назад.

                        Улучшить вопрос

<code>
str_1 = ['hdi', 'quy', 'f', 'hdi', 'djk', '4', 'hdi', '3','hdi']
str_2 = 'hdi'
secondPos = str_1.index(str_2, str_1.index(str_2) + len(str_2),
len(str_1))
print(str_1[secondPos - 1:secondPos])
</code>
программа должна вывести f43, сейчас прога находит только второе совпадения - как сделать чтоб находила все начиная со второго совпадения ?

Можно сначала разделить строку на список по разделителю `hdi', а потом взять последюю букву из каждой части, если она есть:

str_1 = 'hdiquyqgeorgfquegfhdidjkfhgjhdfqiewf8234fhioh3f49f234hdijdblqclecqec23hdi'
sep = 'hdi'

result = ''.join([part[-1] for part in str_1.split(sep) if part])
print(result)

Второй способ - использовать регулярные выражения:

import re

str_1 = 'hdiquyqgeorgfquegfhdidjkfhgjhdfqiewf8234fhioh3f49f234hdijdblqclecqec23hdi'

result = ''.join(re.findall(r'(.)hdi', str_1))
print(result)

P.S. Ваш вопрос очень непонятно сформулирован. Вы хотели найти один символ перед каждым вхождением и объединить все найденные символы в общую строку.


не получается применить созданную функцию
код вне функции работает корректно, переводит строку в список и убирает лишние символы

my_str = '32 431 348 453  45'

my_list = list(my_str)

my_list = [i for i in my_list if i not in [' ', '4', '5']]

my_list = [int(i) for i in my_list]

print(my_list)

# [3, 2, 3, 1, 3, 8, 3]

но внутри функции не работает и не возвращает никаких ошибок

def str_to_int(r1, r2):

    my_list = list(my_str)
    my_list = [i for i in my_list if i not in [' ', 'r1', 'r2']]
    my_list = [int(i) for i in my_list]

    print(my_list)

my_str = '32 431 348 453  45'

str_to_int(4, 5)

# [3, 2, 4, 3, 1, 3, 4, 8, 4, 5, 3, 4, 5]

Ответ на ваш дополнительный вопрос:
Чтобы задать произвольное количество аргументов у функции, можно объявить её вот так:

def str_to_int(*r):
    ...

Тогда r внутри функции будет кортежем из её аргументов. Чтобы преобразовать это в список, можно, например, сделать так:

def str_to_int(*r):
    r1 = [' '] + list(r)

К тому же другие фрагменты можно переписать с использованием встроенных средств языка. Можно заменить

[int(i) for i in my_list]

на

list(map(int, my_list))

,
map() применяет первый аргумент — функцию ко всем элементам второго аргумента — итерируемого контйнера.
Проверку на вхождение в цикле можно реализовать с помощью
filter(), но тут уже придётся использовать лямбда-выражение


в заданной строке из цифр и букв, вывести только строчные буквы [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 3 года назад.

                        Улучшить вопрос

Дана строка символов. Вывести на экран только строчные буквы.

s = 'aBc1dE5fgh'
print(''.join(c for c in s if c.islower() and not c.isdigit()))

или

s = 'aBc1dE5fgh'
print(''.join(filter(str.islower, filter(str.isalpha, s))))


Не работают модели Django из Docker
Внутри докера получаю ошибку

from . import views
  File "/code/apps/graph/views.py", line 15, in <module>
    from models import Session
  File "/code/apps/graph/models.py", line 3, in <module>
    class Article(models.Model):
  File "/usr/lib/python3.7/site-packages/django/db/models/base.py", line 111, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class models.Article doesn't declare an explicit app_label and isn't in
an application in INSTALLED_APPS.

models.py

from django.db import models

class Article(models.Model):
    """
    Описание статьи для хранения ее в базе данных SQLite
    """

    name = models.CharField(max_length=100)
    link = models.CharField(max_length=100)
    source = models.CharField(max_length=100)

settings.py

INSTALLED_APPS = [
    'apps.parsing',
    'apps.graph',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Указывайте полный путь к классу приложения.
Пример:

INSTALLED_APPS = [
    'apps.parsing.apps.ParsingConfig',
    'apps.graph.apps.GraphConfig',
]

Именно классы отвечают за то, как
Django воспринимает Ваше приложение.
apps/parsing/apps.py:

from django.apps import AppConfig

class ParsingConfig(AppConfig):
    name = 'parsing'


Python, IndexError: string index out of range
Не понимаю как исправить ошибку. При вводе aaaabbcaa должно появиться
a4b2c1a2, но появляется
a4bbcaa и ошибка:

line 10, in <module>
    if gen[j]==gen[i]:
IndexError: string index out of range

gen=input()
l=len(gen)-1

for i in range(0,l):
  chs=1
  if gen[i]==int:
    continue

  for j in range(i+1,l+1):
    if gen[i]==chs:
      continue
    if gen[j]==gen[i]:
      chs+=1
    elif gen[j]!=gen[i]:
      s=gen[i:j]
      s=s.replace(s[i:j],s[i]+str(chs))
      gen=s+gen[j:l+1]
      continue
print(gen)

Вы можете использовать подобный алгоритм для преобразования строки

>>> gen = "aaaabbcaa"
>>> res = []
>>> for c in gen:
...   if res and c == res[-1][0]:
...     res[-1][1] += 1
...   else:
...     res += [[c, 1]]
...
>>> ''.join(''.join(str(elem) for elem in sub) for sub in res)
'a4b2c1a2'

Т.е. код будет выглядеть следующим образом:

gen = input()
res = []
for c in gen:
  if res and c == res[-1][0]:
    res[-1][1] += 1
  else:
    res += [[c, 1]]
print(''.join(''.join(str(elem) for elem in sub) for sub in res))

UPD
Проблема вашего кода заключается в том, что вы изменяете строку
gen, а значит, изменяется и её длина, в то время как у вас циклы идут по статичной длине изначальной строки. Чтобы проверить это, запустите этот код и убедитесь в результате:

trace = lambda: print(f'l = {l}; chs = {chs}; i = {i}; j = {j};\n\t\ts = {s}; gen = {gen}')
gen = 'aaaabbcaa'
l=len(gen)-1
j = None
s = ''

for i in range(0,l):
  chs=1
  trace()
  if gen[i]==int:
    continue

  for j in range(i+1,l+1):
    trace()
    if gen[i]==chs:
      continue
    if gen[j]==gen[i]:
      chs+=1
    elif gen[j]!=gen[i]:
      s=gen[i:j]
      s=s.replace(s[i:j],s[i]+str(chs))
      gen=s+gen[j:l+1]
      continue
print(gen)

Как видно по последнему удачному выводу переменных, длина строки
gen равна 7, т.е. последний индекс в ней - 6, а в переменной
j находится число 7. Отсюда и исключение

l = 8; chs = 1; i = 0; j = None;
        s = ; gen = aaaabbcaa
l = 8; chs = 1; i = 0; j = 1;
        s = ; gen = aaaabbcaa
l = 8; chs = 2; i = 0; j = 2;
        s = ; gen = aaaabbcaa
l = 8; chs = 3; i = 0; j = 3;
        s = ; gen = aaaabbcaa
l = 8; chs = 4; i = 0; j = 4;
        s = ; gen = aaaabbcaa
l = 8; chs = 4; i = 0; j = 5;
        s = a4; gen = a4bbcaa
l = 8; chs = 5; i = 0; j = 6;
        s = a4; gen = a4bbcaa
l = 8; chs = 6; i = 0; j = 7;
        s = a4; gen = a4bbcaa
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    if gen[j]==gen[i]:
IndexError: string index out of range


Помогите разобраться с решением задачи Python

Условие:
Дан текст на русском языке. Посчитайте, сколько раз встречается в тексте каждое слово.

Слово — это последовательность русских букв. Кроме слов, в тексте могут присутствовать пробелы и знаки препинания (
«,», «.», «!», «?», «:» и «;»). Других символов в тексте нет.
Слова необходимо сравнивать с точностью до регистра. То есть «Привет» и «привет» — это одно и то же слово, а вот «рыба», «рыбы» и «рыбу» — три разных.

Ввод:
В первой строчке задано одно целое число N (1 ≤ N ≤ 1000) — количество строк в тексте. В следующих N строках приведён сам русский текст. Текст состоит из русских букв, пробелов и знаков препинания: «,», «.», «!», «?», «:» и «;». Длина текста не превышает 100 000 символов.

Вывод:
  Выведите слова исходного текста, упорядоченные по убыванию количества их попаданий в текст. В случае, если два слова встречаются в тексте одинаковое количество раз, выведите их в лексикографическом порядке.

Каждое слово нужно вывести в отдельной строке. Первая буква слова должна быть заглавной (даже если она не была заглавной в исходном тексте), остальные — строчными.
Пример:

Ввод:

2
Ехал Грека через реку. Видит Грека в реке рак.
Сунул Грека руку в реку, рак за руку Греку цап.

Вывод:

Грека
В
Рак
Реку
Руку
Видит
Греку
Ехал
За
Реке
Сунул
Цап
Через

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

words_dict = {}
sentences1 = [input().split() for i in range(int(input()))]
sentences = [j.strip('!?:;,.').capitalize() for i in sentences1 for j in i]
for i in sentences:
    words_dict[i] = words_dict[i] + 1 if i in words_dict else 1
for word, qwerty in sorted(words_dict.items(), key=lambda x: (-x[1], x[0])): # вот тут непонятно key=lambda x: (-x[1], x[0])
    print(word.capitalize())

На строке 6 в конце мне не до конца понятно, как работает выделенная функция, а именно, что она делает.
P.S. Заранее спасибо!

words_dict.items() - это список значений вашего словаря. Он имеет вид:

dict_items([('Ехал', 1), ('Грека', 3), ('Через', 1), ('Реку', 2), ('Видит', 1), ('В', 2), ('Реке', 1), ('Рак', 2), ('Сунул', 1), ('Руку', 2), ('За', 1), ('Греку', 1), ('Цап', 1)])

Зная это, можно дать пояснение к сортировке:

# Отсортированный words_dict.items(),
# где сначала в обратном порядке производится сортировка по x[1], т.е. количеству,
# а потом - внутри секций в прямом порядке по x[0], т.е. по самим словам
sorted(words_dict.items(), key = lambda x: (-x[1], x[0]))

Параметр
key в функции
sorted указывает, по чём именно сортируется итерируемый объект.

Более простой пример: имея список кортежей
[(1, 2), (-2, 3), (5, -10)], можно с помощью
key отсортировать его, например, по нулевому элементу:

# x - это сами элементы списка, а сортируем мы по x[0]
>>> sorted([(1, 2), (-2, 3), (5, -10)], key = lambda x: x[0])
[(-2, 3), (1, 2), (5, -10)]


Как отследить время выполнения программы на Python?
Есть функция. Нужно отслеживать время выполнения функции в реальном времени. То есть: выполняется функция и как только время выполнение функции превышает, скажем, 4 секунды, выполнение функции прекращалось

нормально прервать можно только процесс multiprocessing/subprocess

import multiprocessing, subprocess, time

def target():
    time.sleep(10)
    print(target)

def process_with_timeout_terminate(timeout: float, func: 'callable', *args, **kwargs):
    p = multiprocessing.Process(target=func, args=args, kwargs=kwargs)
    p.start()
    p.join(timeout)  # Wait until child process terminates
    if p.is_alive():
        p.terminate()  # Terminate process; sends SIGTERM signal or uses TerminateProcess()

def programma_with_timeout_terminate(timeout: float, programma: str, *args):
    p = subprocess.Popen([programma, *args])
    try:
        p.wait(timeout)  # Wait for child process to terminate; returns self.returncode.
    except subprocess.TimeoutExpired:
        p.terminate()  # Terminates the process.

if __name__ == '__main__':
    process_with_timeout_terminate(timeout=4, func=target)
    programma_with_timeout_terminate(timeout=4, programma='notepad.exe')

Если же требуется прервать выполнение в главном процессе или в потоке, то прервать функцию можно только если она генератор, т.е. в процессе своего выполнения она что-то возвращает используя yield. В этом случае прервать ее можно, но только после выполнения любого из таких yield. Однако слудкет помнить, что время которое может пройти между срабатываниями yield, может быть и больше timeout, т.е. не факт что прерывание выполнения произойдет точно в то время, как вы хотите.

import time

def target():
    while True:
        time.sleep(1)
        print(target)
        yield

def generator_with_timeout_terminate(timeout: float, func: 'callable', *args, **kwargs):
    t = time.monotonic()
    for _ in func(*args, **kwargs):
        if (time.monotonic() - t) >= timeout:
            break

if __name__ == '__main__':
    generator_with_timeout_terminate(timeout=4, func=target)

Если требуется просто получить время выполнения куска кода или функции

import contextlib, time, datetime

def func(s):
    time.sleep(s)

@contextlib.contextmanager
def get_time():
    dt = {'start': datetime.datetime.now(), }
    try:
        yield dt
    except:
        raise
    finally:
        dt['stop'] = datetime.datetime.now()
        dt['execute'] = (dt['stop'] - dt['start']).total_seconds()

if __name__ == '__main__':
    with get_time() as dt:
        func(3)
        func(2)
        time.sleep(1)
    print(dt)  # {'execute': 6.001126б 'start': datetime.datetime(2020, 4, 30, 11, 33, 7, 521648), 'stop': datetime.datetime(2020, 4, 30, 11, 33, 13, 522774)}

    t = time.monotonic()
    func(3)
    func(2)
    time.sleep(1)
    print(time.monotonic() - t, 'сек')  # 6.0 сек


Зачем нужен оператор pass?
Для чего в python используется конструкция
pass?

Синтаксис
Python требует, чтобы у некоторых операторов обязательно было тело: класс, функция, условие и т. д. Но иногда необходимо, чтобы там ничего не выполнялось. В таком случае подставляют
pass.
Практические кейсы использования:

Создание пользовательского класса на основе другого
Актуально там, где имя класса несёт смысл (исключения, модели БД и т. п.):

class MyException(Exception):
    pass

Декорирование:

@decorator
class MyClass(OtherClass):
    pass

@decorator
def f():
    pass

Создание методов абстрактного класса:

class MyABC(ABC):
    @abstractmethod
    def method(self):
        pass

Обработка исключений:

try:
    f()
except:
    pass


Отличие type() от isinstance()
В чём отличие между этими двумя функциями в
python?

isinstance учитывает наследование, а
type — нет.
Пример:

class Bacon:
    pass

class Spam(Bacon):
    pass

x = Spam()

type(x) is Spam       # True
type(x) is Bacon      # False
isinstance(x, Spam)   # True
isinstance(x, Bacon)  # True

На практике данную особенность можно использовать, чтобы поддерживать полиморфизм.
Допустим, что функция должна менять поведение в зависимости от типа переданных данных. Например, по особому обрабатывать словари:

def f(arg):
    if type(arg) is dict:
        print('Передан словарь!')

Если передать в неё обычный словарь, всё будет в порядке. Но если передать
collections.OrderedDict, всё сломается, несмотря на то, что
OrderedDict поддерживает все необходимые методы.
Чтобы избежать этого и обрабатывать все типы, которые наследуются от
dict, можно воспользоваться
isinstance:

if isinstance(arg, dict):
    print('Передан словарь!')


дописать функцию shot(), произвести "выстрел"
я хочу создать "пулю", которая будет появляться в координатах равным координатам user_x, user_y и устремляться вверх.
<code>
import pygame
import random

pygame.init()

display_width = 594 #ширина
display_height = 600 #высота

display = pygame.display.set_mode((display_width, display_width))

user_width = 56
user_height = 60
user_x = 269
user_y = display_height - user_height - 25
speed = 3

"""set_mode = режим работы"""

display = pygame.display.set_mode((display_width, display_width))# 2 скобки

bullet = pygame.image.load("bullet.jpg")

def run_game():
game = True
land = pygame.image.load("disp.jpg")
hero = pygame.image.load("ship_img.jpg")
bullet = pygame.image.load("bullet.jpg")
"""выход из игры"""
while game:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    keys = pygame.key.get_pressed()
    if keys[pygame.K_a]:
        left_swipe()
    if keys[pygame.K_d]:
        right_swipe()
    if keys[pygame.K_SPACE]:
        shot()
    """blit вставление"""
    """fill заполнение"""
    bullet_y = user_y - user_width
    display.blit(land, (0, 0))
    display.blit(hero, (user_x, user_y))
    return_to()

    pygame.display.update()

"""движениe"""

def left_swipe():
    global user_x
    user_x -= speed

def right_swipe():
    global user_x
    user_x += speed

"""выход за экран"""

def return_to():
    global user_x
    if user_x > display_width:
        user_x = -54
    if user_x < - 55:
        user = display width

def shot():
"""должен производить выстрел"""

run_game()
</code>

Я предлагаю вам создать класс этих самых пуль и добавить метод, отвечающий за их движение:

class Bullet(pygame.sprite.Sprite):
    def __init__(self, image_file, location, speed):
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location
        self.speed = speed

    def move(self):
        self.rect = self.rect.move(self.speed)

Затем нужно создать группу этих самых снарядов с помощью pygame.sprite.Group(), вот так:

bullets = pygame.sprite.Group()

Затем в функции shot() создавать новый объект-пулю и добавлять его в группу:

bullet = Bullet(pygame.image.load("ваш_спрайт"), [user_x, user_y], [0, -2]) #сюда можно любую скорость
bullets.add(bullet)

И наконец, в главном цикле, отрисовывать и двигать их:

for b in bullets:
    display.blit(b.image, b.rect)
    b.move()


Как извлечь файлы с одинаковыми названиями, но из разных архивов, переименовывая
Есть 3 архива:
Alex.zip,
Toto.zip и
Room.zip
В каждом из них одинаковый набор разных по содержанию изображений:

triangle_НОМЕР.png
square_НОМЕР.png
star_НОМЕР.png

Где НОМЕР - цифра от нуля до тысячи.
Проблема в том, что одинаковые по названию изображения из разных архивов различны по содержанию.
Требуется извлечь их в папки
triangle,
square,
star, соответственно названию, и присвоить им вместо имени число, так, чтобы в каждой папке все изображения были от, например для star,
star.0.png до
star.КОЛИЧЕСТВО_ИЗОБРАЖЕНИЙ_В_ПАПКЕ.png (аналогично для других изображений).

Как-то так:
<code>
import os
from collections import defaultdict
from zipfile import ZipFile
from glob import glob

def unpack(filename, registry, to_dir="."):
    with ZipFile(filename) as zf:
        for file in zf.filelist:
            fn = os.path.join(to_dir, file.filename)
            kind = fn.partition("_")[0]
            zf.extract(file, to_dir)
            _, ext = os.path.splitext(fn)
            os.rename(fn, f"{kind}.{registry[kind]}{ext}")
            registry[kind] += 1

file_registry = defaultdict(int)

for file in glob(r"C:\temp\test\*.zip"):
    unpack(file, file_registry, to_dir=r"C:\temp\test\result")
</code>


Передать аргументы массива в функцию
Пытаюсь передать по одному аргументу массива в функцию, но в выводе пишет
None, хотя если просто число вводить, то работает нормально.
main.py:

summ = [88, 87, 126, 78, 122]

for k in range(len(summ)):
    print(p.summarise(hash_table, summ[k]))

p.py:

def summarise(hash_table, sum):
    pairs = []
    for i in range(len(hash_table)):
        for j in range(len(hash_table[i])):
            if sum == (hash_table[i][0] + hash_table[j][0]):
                if (hash_table[i][0], hash_table[j][0]) not in pairs and (hash_table[j][0], hash_table[i][0]) not in pairs:
                    pairs.append((hash_table[i][0], hash_table[j][0]))
                    return(pairs)

Ваша проблема в том, что Вы возвращаете из функции значение далеко не всегда. В частности, если все циклы полностью выполнятся, то будет возвращено
None. Это легко увидеть, если переписать код в эквивалентном виде:

def summarise(hash_table, sum):
    pairs = []
    for i in range(len(hash_table)):
        for j in range(len(hash_table[i])):
            if sum == (hash_table[i][0] + hash_table[j][0]):
                if (hash_table[i][0], hash_table[j][0]) not in pairs and (hash_table[j][0], hash_table[i][0]) not in pairs:
                    pairs.append((hash_table[i][0], hash_table[j][0]))
                    return(pairs)
    return None

Теперь, для того, чтобы не получать
None, можно поступить так:

def summarise(hash_table, sum):
    pairs = []
    for i in range(len(hash_table)):
        for j in range(len(hash_table[i])):
            if sum == (hash_table[i][0] + hash_table[j][0]):
                if (hash_table[i][0], hash_table[j][0]) not in pairs and (hash_table[j][0], hash_table[i][0]) not in pairs:
                    pairs.append((hash_table[i][0], hash_table[j][0]))
                    return(pairs)
    return pairs

Следует отметить, что не следует возвращать в одной и той же функции
None и НЕ
None в разных случаях. Это нарушает сигнатуру функции и усложняет логику. Если Вам нужно возвращать специфичное значение, Вы можете воспользоваться либо дополнительным возвращаемым аргументом:

def summarise(hash_table, sum):
    pairs = []
    for i in range(len(hash_table)):
        for j in range(len(hash_table[i])):
            if sum == (hash_table[i][0] + hash_table[j][0]):
                if (hash_table[i][0], hash_table[j][0]) not in pairs and (hash_table[j][0], hash_table[i][0]) not in pairs:
                    pairs.append((hash_table[i][0], hash_table[j][0]))
                    return pairs, True
    return [], False # Здесь можно возвращать `None`, но лучше пустой массив.

Вы также можете сгенерировать исключение:

def summarise(hash_table, sum):
    pairs = []
    for i in range(len(hash_table)):
        for j in range(len(hash_table[i])):
            if sum == (hash_table[i][0] + hash_table[j][0]):
                if (hash_table[i][0], hash_table[j][0]) not in pairs and (hash_table[j][0], hash_table[i][0]) not in pairs:
                    pairs.append((hash_table[i][0], hash_table[j][0]))
                    return pairs
    raise Exception('my exception')

Снаружи Вы его можете перехватить.
Следует также отметить, что не стоит писать так много вложенных конструкций. Читать их сложно. Лучше так:

def summarise(hash_table, sum):
    pairs = []
    for i in range(len(hash_table)):
        # Также, лучше переработать эту функцию так, чтобы вынести один из циклов в отдельную функцию.
        for j in range(len(hash_table[i])):
            if sum != (hash_table[i][0] + hash_table[j][0]):
                continue
            a = (hash_table[i][0], hash_table[j][0]) not in pairs
            b = (hash_table[j][0], hash_table[i][0]) not in pairs
            if a and b:
                pair = (hash_table[i][0], hash_table[j][0])
                pairs.append(pair)
                return pairs, True
    return [], False


Python Kivy Как изменить событие on_press в классе Button
Вот пример кода
<code>
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

class a(App):
    def build(self):
        self.btn = Button(on_press=self.press)

        return self.btn

    def press(self, instance, **kwargs):
        self.btn.bind(on_press=self.nothing)
        print(1)

    def nothing(self, *args, **kwargs):
        print(2)

a().run()
</code>
Мне нужно, чтобы при нажатии на кнопку, у нее событие on_press изменилось, или чтобы она просто ничего не делала, но у меня выходит, что она вызывает сразу 2 функции. Как это лечить или что я делаю не так?

Если я вас правильно понял, то 'перебиндить' кнопку можно так:
<code>
class MyApp(App):
    def build(self):
        self.btn = Button(text="click")
        self.btn.bind(on_press=self.press)
        return self.btn

    def press(self, instance, **kwargs):
        self.btn.unbind(on_press=self.press)
        self.btn.bind(on_press=self.nothing)
        print('press')

    def nothing(self, *args, **kwargs):
        print('nothing')

MyApp().run()
</code>


Функция возвращает None, хотя есть return
Не могу понять почему у меня словарь возвращается из функции parse_rows нормально, но если возвращать из функции read_graph результат функции parse_rows, то возвращается None?
<code>
def read_graph(FileName) -> dict:
    try:
        f = open(FileName)
        NewNodes = dict()
        return parse_rows(f, NewNodes) # Возвращает None
    except FileNotFoundError as ex:
        print(ex)

def parse_rows(f, NewNodes) -> dict:
    Line = f.readline()
    if Line == '':
        print(NewNodes) # Всё хорошо выводится перед возвратом из этой функции
        return NewNodes # Значит возвращается то что нужно
    else:
        test = Line.replace('\n', '').split('\t')
        VertexNum, Row = int(test.pop(0)), test
        if NewNodes.get(VertexNum) is None:
            NewNodes[VertexNum] = []
        # print(NewNodes)
        get_edges_from_line(NewNodes, VertexNum, Row)
        # print(NewNodes)
        parse_rows(f, NewNodes)

print(read_graph('MyFile.txt'))
</code>

В
parse_rows - из
else ничего не возвращается.

else:
    ...
    return parse_rows(f, NewNodes)

В
read_graph - из
except ничего не возвращается.


Установка фокуса ввода в pyqt5
Требуется установить фокус ввода на конкретный виджет, пытаюсь это сделать при помощи метода setFocus, но результата нет, в чем может быть проблема?
<code>
from PyQt5 import QtWidgets, QtCore
import sys

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
lineedit1 = QtWidgets.QLineEdit()
lineedit2 = QtWidgets.QLineEdit()
lineedit2.setFocus()
button1 = QtWidgets.QPushButton('t&ext')
vbox = QtWidgets.QVBoxLayout()
vbox.addWidget(lineedit1)
vbox.addWidget(lineedit2)
vbox.addWidget(button1)
window.setLayout(vbox)
window.show()
sys.exit(app.exec_())
</code>

Попробуйте установить фокус после добавления виджетов на форму:
<code>
from PyQt5 import QtWidgets, QtCore
import sys

app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
lineedit1 = QtWidgets.QLineEdit()
lineedit2 = QtWidgets.QLineEdit()
button1 = QtWidgets.QPushButton('t&ext')
vbox = QtWidgets.QVBoxLayout()
vbox.addWidget(lineedit1)
vbox.addWidget(lineedit2)
vbox.addWidget(button1)
window.setLayout(vbox)
lineedit2.setFocus()                # <<<<<<<<<<<<
window.show()
sys.exit(app.exec_())
</code>


ошибка "zero-size array to reduction operation minimum which has no identity"
При построении графика выдает ошибку " zero-size array to reduction operation minimum which has no identity "
При этом если идти по пути try-except, то график не строится
Основная часть кода:
<code>
best = data_ege.groupby("Регион").count().reset_index()

best["Title"] = best["Регион"].astype(str) + ": " + round(best["Объект"], 1).astype(str)

data = gpd.read_file("rus_data.json")
data = data.to_crs({'init':'epsg:3857'})

data = pd.merge(left=data, right=best,
                left_on="NAME_1", right_on="Регион", how="left")
fig = plt.figure(figsize=(12, 12))
area = plt.subplot(1, 1, 1)

data.plot(ax=area, legend=True, column="Объект", cmap='Reds') # Ошибка в этой строке!!!

area.legend([], title="\n".join(best.Title), loc="upper left")
plt.title("Количество объектов", fontsize=20)
plt.show()
</code>

Разобрался самостоятельно. Проблема была в том, что при объединении столбцов из csv и json, текстовые данные имели одинаковые значения, но при этом с разных регистров. Поэтому, приведя данные из csv к нижнему регистру, а также данные из json к нижнему регистру, график построился.


Как получить строку из байтов?
Я пытаюсь сделать дехешер вот такого чуда -
9gn2kfvt9gbptel56u3bjgirumgjfjm1ffo9gl1e7c90etvis0un9i4f4g13jvih.
Но у меня не получается
Мой код:

def hashpass(passsw, salt):
    m = hashlib.sha512()
    m.update(salt.encode('utf-8'))
    m.update(passsw.encode('utf-8'))
    byte = m.digest()
    len_byte = len(byte)
    print('Колицество символов - ' + str(len_byte))
    res = ''
    for n in range(0, len_byte):
        hex_byte = hex((byte[n] & 255) + 256)
        res += hex_byte
        print(hex_byte)

hashpass('45345345', 'plvbutgseltevdjj')

Вывод:
0x173
0x15b
0x16c
0x1c5
0x1d9
0x115
0x18c
0x165
0x110
0x1a9
0x1cf
0x11f
0x193
0x16c
0x16b
0x159
0x142 ...
Код этой функции на Java (нужно реализовать то же самое на Python):

public static String hashPass(String password, String salt) {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(salt.getBytes(StandardCharsets.UTF_8));
        byte[] bytes = md.digest(password.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        byte[] var5 = bytes;
        int var6 = bytes.length;

        for(int var7 = 0; var7 < var6; ++var7) {
            byte b = var5[var7];
            sb.append(Integer.toString((b & 255) + 256, 32).substring(1));
        }

        return sb.toString();
    } catch (Exception var9) {
        var9.printStackTrace();
        throw new RuntimeException();
    }
}

Магическая конструкция
Integer.toString((b & 255) + 256, 32).substring(1) - это перевод числа в систему счисления с базой 32 (в которой цифры от 0 до 9 и от a до v - аналогично как в 16-ричной системе цифры от 0 до 9 и от a до f), и взятие последней цифры*.
Можно было записать короче:
Integer.toString(b % 32, 32).
На python эту же операцию для одного байта можно выполнить так:

import string

alphabet = string.digits + string.ascii_lowercase

encoded = alphabet[b % 32]

В вашем коде нужно поменять цикл перекодировки:

import string

alphabet = string.digits + string.ascii_lowercase

def hashpass(passsw, salt):
    # ...
    res = ''
    for b in byte:
        encoded = alphabet[b % 32]
        res += encoded
        # print(encoded)
    return res

print(hashpass('45345345', 'plvbutgseltevdjj'))

* - строго говоря, цифр начиная со второй, но т.к. для b в диапазоне от 0 до 255 после сложения с 256 в системе с базой 32 в любом случае получится 2 цифры (от 80 до fv), то это будет всегда последняя цифра


Минус перед аргументом [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 3 года назад.

                        Улучшить вопрос

что значит этот фрагмент кода? -(heappop(high)) при том, что high массив отрицательных чисел?

Функция
heappop возвращает одно число из массива
high. А минус приводит его к противоположному по знаку значению


Как программно нажать на кнопку в tkinter (Python)?
Как программно нажать на кнопку в tkinter? (Python)

В ткинтере нажатие кнопки вызывает функцию.

button.config(command=fun1)можно сразу её вызвать в нужный момент, и какбы вы нажали эту кнопку.
fun1()


Как обойти словарь python и соеденить строки в переменной
возможно задача тривиальна но все же подскажите если знаете. Есть словарь типа:

dict = {'text1': '12345', 'text2': '67890', 'text3': '12345'}

Простым циклом:

for key in dict:
    print(dict[key])

я вывожу значения:

12345
67890
12345

Как образом циклом:

for key in dict:
    print(dict[key])

добавить все значения value поочереди в переменную content (сохраняя перенос строки)
я понимаю что нужна конкатенация строк или что то в этом роде но не могу понять как.
Большое спасибо за советы

Например, так. Кстати, не стоит называть переменные именами стандартных типов - можно получить неожиданные ошибки

d = {'text1': '12345', 'text2': '67890', 'text3': '12345'}
var = '\n'.join(d.values())
print(var)

в связи с комментарием. всё так же

import json

var = json.loads(var)
res = []
for i in var['fields']['description']['content']:
    for i in i['content']:
        for key, value in i.items():
            if key == 'text':
                res.append(value)
res = '\n'.join(res)
print(res)


Стандартный модуль zipfile. Не найду класс class zipfile.Path(root, at='')
В документации по модулю zipfile  присутствует описание класса
class zipfile.Path(root, at=''). Однако я не могу его найти. Поиск "в лоб":

>>> import zipfile
>>> dir(zipfile)
['BZIP2_VERSION',
 'BadZipFile',
 'BadZipfile',
 'DEFAULT_VERSION',
 'LZMACompressor',
 'LZMADecompressor',
 'LZMA_VERSION',
 'LargeZipFile',
 'MAX_EXTRACT_VERSION',
 'PyZipFile',
 'ZIP64_LIMIT',
 'ZIP64_VERSION',
 'ZIP_BZIP2',
 'ZIP_DEFLATED',
 'ZIP_FILECOUNT_LIMIT',
 'ZIP_LZMA',
 'ZIP_MAX_COMMENT',
 'ZIP_STORED',
 'ZipExtFile',
 'ZipFile',
 'ZipInfo',
 '_CD64_CREATE_VERSION',
 '_CD64_DIRECTORY_RECSIZE',
 '_CD64_DIRECTORY_SIZE',
 '_CD64_DISK_NUMBER',
 '_CD64_DISK_NUMBER_START',
 '_CD64_EXTRACT_VERSION',
 '_CD64_NUMBER_ENTRIES_THIS_DISK',
 '_CD64_NUMBER_ENTRIES_TOTAL',
 '_CD64_OFFSET_START_CENTDIR',
 '_CD64_SIGNATURE',
 '_CD_COMMENT_LENGTH',
 '_CD_COMPRESSED_SIZE',
 '_CD_COMPRESS_TYPE',
 '_CD_CRC',
 '_CD_CREATE_SYSTEM',
 '_CD_CREATE_VERSION',
 '_CD_DATE',
 '_CD_DISK_NUMBER_START',
 '_CD_EXTERNAL_FILE_ATTRIBUTES',
 '_CD_EXTRACT_SYSTEM',
 '_CD_EXTRACT_VERSION',
 '_CD_EXTRA_FIELD_LENGTH',
 '_CD_FILENAME_LENGTH',
 '_CD_FLAG_BITS',
 '_CD_INTERNAL_FILE_ATTRIBUTES',
 '_CD_LOCAL_HEADER_OFFSET',
 '_CD_SIGNATURE',
 '_CD_TIME',
 '_CD_UNCOMPRESSED_SIZE',
 '_DD_SIGNATURE',
 '_ECD_COMMENT',
 '_ECD_COMMENT_SIZE',
 '_ECD_DISK_NUMBER',
 '_ECD_DISK_START',
 '_ECD_ENTRIES_THIS_DISK',
 '_ECD_ENTRIES_TOTAL',
 '_ECD_LOCATION',
 '_ECD_OFFSET',
 '_ECD_SIGNATURE',
 '_ECD_SIZE',
 '_EXTRA_FIELD_STRUCT',
 '_EndRecData',
 '_EndRecData64',
 '_FH_COMPRESSED_SIZE',
 '_FH_COMPRESSION_METHOD',
 '_FH_CRC',
 '_FH_EXTRACT_SYSTEM',
 '_FH_EXTRACT_VERSION',
 '_FH_EXTRA_FIELD_LENGTH',
 '_FH_FILENAME_LENGTH',
 '_FH_GENERAL_PURPOSE_FLAG_BITS',
 '_FH_LAST_MOD_DATE',
 '_FH_LAST_MOD_TIME',
 '_FH_SIGNATURE',
 '_FH_UNCOMPRESSED_SIZE',
 '_SharedFile',
 '_Tellable',
 '_ZipDecrypter',
 '_ZipWriteFile',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_check_compression',
 '_check_zipfile',
 '_crctable',
 '_gen_crc',
 '_get_compressor',
 '_get_decompressor',
 '_strip_extra',
 'binascii',
 'bz2',
 'compressor_names',
 'crc32',
 'error',
 'importlib',
 'io',
 'is_zipfile',
 'lzma',
 'main',
 'os',
 'shutil',
 'sizeCentralDir',
 'sizeEndCentDir',
 'sizeEndCentDir64',
 'sizeEndCentDir64Locator',
 'sizeFileHeader',
 'stat',
 'stringCentralDir',
 'stringEndArchive',
 'stringEndArchive64',
 'stringEndArchive64Locator',
 'stringFileHeader',
 'struct',
 'structCentralDir',
 'structEndArchive',
 'structEndArchive64',
 'structEndArchive64Locator',
 'structFileHeader',
 'sys',
 'threading',
 'time',
 'zlib']

Особо не помог. А возможности этого класса - судя по описанию - заманчивые. Не подскажите - где искать, как использовать?

Похоже вы используете Python версии < 3.8.
Выдержка из документации:

<code>
class zipfile.Path
</code>
A pathlib-compatible wrapper for zip files. See section Path Objects
  for details.
New in version 3.8.


Как оптимально посчитать сколько раз встречается в тексте каждое слово?
Частотный анализ – 1. Условие:
Дан текст на русском языке. Посчитайте, сколько раз встречается в тексте каждое слово.
Слово — это последовательность русских букв. Кроме слов, в тексте могут присутствовать пробелы и знаки препинания («,», «.», «!», «?», «:» и «;»). Других символов в тексте нет.
Слова необходимо сравнивать с точностью до регистра. То есть «Привет» и «привет» — это одно и то же слово, а вот «рыба», «рыбы» и «рыбу» — три разных.
Формат ввода:
В первой строчке задано одно целое число N (1 ≤ N ≤ 1000) — количество строк в тексте. В следующих N строках приведён сам русский текст. Текст состоит из русских букв, пробелов и знаков препинания: «,», «.», «!», «?», «:» и «;». Длина текста не превышает 100 000 символов.
Формат вывода:
Выведите слова исходного текста, упорядоченные по убыванию количества их попаданий в текст. В случае, если два слова встречаются в тексте одинаковое количество раз, выведите их в лексикографическом порядке.
Каждое слово нужно вывести в отдельной строке. Первая буква слова должна быть заглавной (даже если она не была заглавной в исходном тексте), остальные — строчными.
Пример
Ввод:

2
Ехал Грека через реку. Видит Грека в реке рак.
Сунул Грека руку в реку, рак за руку Греку цап.

Вывод:

Грека
В
Рак
Реку
Руку
Видит
Греку
Ехал
За
Реке
Сунул
Цап
Через

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

words_dict = {}
sentences1 = [input().split() for i in range(int(input()))]
sentences = [j.strip('!?:;,.').capitalize() for i in sentences1 for j in i]
for i in sentences:
    words_dict[i] = words_dict[i] + 1 if i in words_dict else 1
keys = list(words_dict.keys())
values = list(words_dict.values())
for i in range(len(keys) - 1):
    for j in range(len(keys) - i - 1):
        if keys[j] > keys[j + 1]:
            keys[j], keys[j + 1] = keys[j + 1], keys[j]
            values[j], values[j + 1] = values[j + 1], values[j]
for i in range(len(keys) - 1):
    for j in range(len(keys) - i - 1):
        if values[j] < values[j + 1]:
            values[j], values[j + 1] = values[j + 1], values[j]
            keys[j], keys[j + 1] = keys[j + 1], keys[j]
print('\n'.join(keys))

Он пе проходит по времени, при вводе 900 строк код выполняется за 1.089 секунд моё решение не принимают, ограничение по времени 1 сек. Помогите, пожалуйста, как-нибудь сократить код или найти более оптимальное решение данной задачи.

я бы делал это приблизительно так:
ввод:

N = int(input())
text = " ".join(input() for _ in range(N))

или менее читабельный, но более короткий вариант:

text = " ".join(input() for _ in range(int(input())))

подсчет слов:

res = {}
for word in text.strip(",.!?:;").lower().split():
    res[word] = res[word] + 1 if word in res else 1

for word,cnt in sorted(res.items(), key=lambda x: (-x[1], x[0])):
    print(word.capitalize())

вывод:

Грека
В
Рак
Реку
Руку
Видит
Греку
Ехал
За
Реке
Сунул
Цап
Через


Как параметризовать и передать значения в SQL "IN (?, ..., ?)", не зная заранее количества параметров?
Как можно использовать местозаполнитель (?) в условии
IN?
В функцию передаю список. Есть вариант только создать ещё списки и выполнить executemany, но хотелось бы просто выполнить 1 раз запрос.

def update_completed_tasks(conn, user_id: int, tasks_id: list):
    cursor = conn.cursor()
    sql = """
        UPDATE Tasks
        SET Completed = 1
        WHERE User = ? AND task_id IN (?)
    """
    cursor.execute(sql, [user_id, [*tasks_id]])  # не сработает
    conn.commit()

Решение через доп. список:

def update_completed_tasks(conn, user_id: int, tasks_id: list):
    cursor = conn.cursor()
    temp = []
    for it in tasks_id:
        temp.append([user_id, it])
    sql = """
        UPDATE Tasks
        SET Completed = 1
        WHERE User = ? AND task_id = ?
    """
    cursor.executemany(sql, temp)
    conn.commit()

попробуйте так:

sql_pat = """
        UPDATE Tasks
        SET Completed = 1
        WHERE User = ? AND task_id IN ({})
"""
sql = sql_pat.format(",".join("?" * len(tasks_id)))
cursor.execute(sql, [user_id]+ tasks_id)

пример:

In [6]: user_id = 111; tasks_id = [21, 22, 23]

In [7]: sql = sql_pat.format(",".join("?" * len(tasks_id)))

In [8]: print(sql)

        UPDATE Tasks
        SET Completed = 1
        WHERE User = ? AND task_id IN (?,?,?)

In [9]: params = [user_id]+ tasks_id

In [10]: print(params)
[111, 21, 22, 23]


Как прогнать циклов dict в Python?
Есть такая структура dict
print(name)

{'Натариус': ['2446614', '2446615'], 'Traiding': ['2446600', '2446601', '2446602', '2446603', '2446604', '2446605', '2446606', '2446648', '2446647', '2446725', '2446715', '2446613', '2446687'], 'Бар Шелк': ['2446622', '2446612'], 'БиТел Телеком': ['2446633', '2446699'], 'СТС Логистик': ['2446650', '2446651', '2446652', '2446653', '2446654'] и т д

т.е. есть ключ Натариус, у него значение list из двух элементов
Дальше ключе Traiding, у него значение List из 13 элементов
Как прогнать через цикл for такую структуру, что бы у меня на каждом шагу был доступ к ключу и текущему значению.
Пробую вот так

for key in name:
    for lst in name.values():

Но он во втором цикле идет по всем значениям, а мне надо что бы сначало у первого ключа, потом у второго и т д.


Другой компьютер не может подключится к моему серверу import socket python
Я решил сделать программу, для того чтоб я мог управлять моим компьютером с другого. Но почему-то когда я сам подключаюсь к своему серверу всё работает, а когда я подключаюсь с другого ничего не работает.
Код сервера:

import socket
import os

sock = socket.socket()
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()

print("~||-Cервер-активирован-||~\n")
print('Подключено к ', addr)

while True:
    data = conn.recv(1024)
    udata = data.decode("utf-8")
    if not data:
        break

    os.system(udata)
    print(udata)

conn.close()
print("|-Утеряна-связь-с-клиентом-|\n")

Вот мой клиент:

import socket

print('Привет! Для того чтоб удостоверится что Вам можно пользоваться компом сервера введите пароль.')

while True:
    passw = str(input("Пароль: "))
    if passw == 'xxxx':
        print('Доступ разрешён')
        break
    else:
        print('Доступ запрещён. Попробуй ещё раз')

sock =  socket.socket ()
sock.connect((socket.gethostname(), 9090))
print("Производим подключение к серверу удалённого доступа к компухтеру...")
while True:
    msg = str(input("Сервер дал ответ на ваш запрос. Введите новый или напишите stop, чтобы прервать связь с сервером: "))
    if msg == "stop":
        print("Прерываем связь с сервером...")
        sock.close()
        print("Вы разорвали соединение")
        break

    sock.send(msg.encode('utf-8'))
    print("Вы отправили сообщение. Ждём ответа сервера...")

Помогите, пожалуйста.

sock.connect((socket.gethostname(), 9090))
здесь у тебя должен быть ip сервера или DNS адрес. Так ты пытаешься подключиться к самому себе (127.0.0.1 или localhost) из-за чего у тебя не получаеться подключиться у другому устройству.

import socket
import sys

if len(sys.argv) < 2: # Если пользователь не ввел ip
    print("Usage: {0} <host_ip>".format(sys.argv[0]))
    sys.exit()

print('Привет! Для того чтоб удостоверится что Вам можно пользоваться компом сервера введите пароль.')

while True:
    passw = str(input("Пароль: "))
    if passw == 'xxxx':
        print('Доступ разрешён')
        break
    else:
        print('Доступ запрещён. Попробуй ещё раз')

sock =  socket.socket ()
sock.connect((sys.argv[1], 9090)) # Это должен быть ip компьютера
print("Производим подключение к серверу удалённого доступа к компухтеру...")
while True:
    msg = str(input("Сервер дал ответ на ваш запрос. Введите новый или напишите stop, чтобы прервать связь с сервером: "))
    if msg == "stop":
        print("Прерываем связь с сервером...")
        sock.close()
        print("Вы разорвали соединение")
        break

    sock.send(msg.encode('utf-8'))
    print("Вы отправили сообщение. Ждём ответа сервера...")

Для исполнения пишешь в консоль:

python3 "script_name" "host_ip"

Например:

python3 client.py 192.168.0.101

Что бы узнать ip:
Linux:

ip a # or sudo ifconfig

Windows:

ipconfig