• Как сложить значения одинаковых ключей в списке словарей?

    from collections import defaultdict
    from itertools import chain
    
    result = defaultdict(int)
    first = [{'month': 'марта', 'stat': 10}, {'month': 'февраля', 'stat': 5}, {'month': 'января', 'stat': 20}]
    second = [{'month': 'марта', 'stat': 12}, {'month': 'февраля', 'stat': 7}, {'month': 'января', 'stat': 17}]
    
    for row in chain(first, second):
        result[row['month']] += row['stat']
    
    print([{'month': k, 'stat': v} for k, v in result.items()])


    уже прорва похожих ответов была
    Ответ написан
    1 комментарий
  • Как избавится от пустых массивов внутри списков?

    простой способ решить в лоб, можно поиграться с тем, что вернуть
    a = [[[], [[{'a': 1, 'b': 2, 'c': [1, 2, []], 'd':0}, []]], [1, 2, 3], []]]
    
    
    def clear_data(data):
        if isinstance(data, (list, tuple)):
            result = []
            for value in data:
                value = clear_data(value)
                if value:
                    result.append(value)
            if len(result) == 1:
                return result[0]
            return result
        elif isinstance(data, dict):
            result = {}
            for key, value in data.items():
                value = clear_data(value)
                if value:
                    result[key] = value
            if result:
                return result
    
        return data
    
    
    print(clear_data(a))
    
    [{'a': 1, 'b': 2, 'c': [1, 2]}, [1, 2, 3]]
    Ответ написан
  • Как парсить единицы измерения ms/s на pyparsing и python?

    на бросал быстренько на чистой регулярки, дальше че хотите то и делайте с результатами
    import re
    from dataclasses import dataclass
    
    
    @dataclass
    class Time:
        minute: int
        second: int
        ms: int
    
        @classmethod
        def init(cls, data):
            return cls(**{k: int(v) for k, v in data.items()})
    
        def to_seconds(self):
            return self.minute * 60 + self.second
    
    
    strings = ["1m57s", "17s520ms", "1m", "10s"]
    time_parse = re.compile(r"((?P<minute>\d+)(m(?!s)))?((?P<second>\d+)(s))?((?P<ms>\d+)(ms))?")
    
    d = [Time.init(time_parse.match(v).groupdict(default='0')) for v in strings]
    
    print(d)
    print([v.to_seconds() for v in d])
    
    [Time(minute=1, second=57, ms=0), Time(minute=0, second=17, ms=520), Time(minute=1, second=0, ms=0), Time(minute=0, second=10, ms=0)]
    [117, 17, 60, 10]
    Ответ написан
    1 комментарий
  • Как вычислить среднюю величину двумерного списка по вертикали?

    # Ваш файл
    file = """
    Петров;85;92;78
    Сидоров;100;88;94
    Иванов;58;72;85
    """.strip().split('\n')
    # преобразуем в данные
    data = {v[0]: list(map(float, v[1:])) for v in (s.split(';') for s in file)}
    print(data)
    # разворачиваем ваш список и считаем
    avg = {i: f'sum({l})/{len(l)} = {sum(l) / len(l)}' for i, l in enumerate(zip(*data.values()))}
    print(avg)

    результат
    {'Петров': [85.0, 92.0, 78.0], 'Сидоров': [100.0, 88.0, 94.0], 'Иванов': [58.0, 72.0, 85.0]}
    {0: 'sum((85.0, 100.0, 58.0))/3 = 81.0', 1: 'sum((92.0, 88.0, 72.0))/3 = 84.0', 2: 'sum((78.0, 94.0, 85.0))/3 = 85.66666666666667'}
    Ответ написан
    Комментировать
  • Как записать к-во свободной оперативки в переменную?

    Можно через баш, можно на питоне.
    free -m | sed -n 2p | awk '{print $4}'
    Ответ написан
    3 комментария
  • Почему значение воспринимается как ключ?

    Все до вас уже придумано, старайтесь пользоваться встроенными функциями

    alph = {
        "q": "й", "w": "ц", "e": "у", "r": "к", "t": "е", "y": "н", "u": "г", "i": "ш", "o": "щ", "p": "з", "a": "ф",
        "s": "ы", "d": "в", "f": "а", "g": "п", "h": "р", "j": "о", "k": "л", "l": "д", "z": "я", "x": "ч", "c": "с",
        "v": "м", "b": "и", "n": "т", "m": "ь", " ": " ", ";": "ж", "'": "э", "?": ",", "/": ".", "&": "?", "`": "ё",
        "[": "х", "]": "ъ", ",": "б", ".": "ю"
    }
    en_char = ''.join(alph)
    ru_char = ''.join(alph.values())
    
    trans = ''.maketrans(en_char, ru_char)
    
    print('ghbdtn'.translate(trans))
    Ответ написан
  • Есть ли в программировании ниши, где нет митингов, огромнейших опенспейсов, бюрократии?

    Я работаю в Группе компаний Тинькофф, примерно год, до этого работал и в других разных крупных компаниях. Везде есть митинги и в этом нет ничего плохого, синхронизация и бюрократия, для крупных компаний и распределенных команд несет много больше пользы, чем вреда.
    Всякие мероприятие полезные и не очень устраиваются, и опять в этом нет ничего плохого, никто не заставляет тебя ходить на них. Гимн во славу Компании мы не поем, какой-то пропаганды тоже нет.
    Если ты выступаешь на конфе, то надо выступать от лица компании, но это в целом логично ты показываешь и рассказываешь о своих рабочих достижениях и успехах, но опять же насильно никто на конфу не шлет, все дело добровольное.
    Никакого дресс-кода нет, ходить в трусах по офису будет не приемлемым, но это и без дресс-кода должно быть понятно.
    По стеку у нас в команде много питонистов. Про руби не слышал, но если поискать, то и на нем кто-нибудь да что-нибудь пишет.
    Ответ написан
    Комментировать
  • Какое приложение выбрать для тестирования API?

    Если мне крайне редко надо дернуть пару ручек для тестирования апи есть курл, мне его вполне достаточно.
    Но если мы говорим уже о каких тестах со сценариями регулярным запуском и шарингом, то я использую python + pytest + request(aiohttp) + allure - и пишу уже нормальные автотесты, которые потом можно поддерживать и расширять.
    Ответ написан
    Комментировать
  • Как запихнуть простой python-скрипт в web-интерфейс?

    Посмотрите в сторону flask или aiohttp.
    И тот и другой позволяют организовать простой интерфейс для ваших целей.
    Ответ написан
    Комментировать
  • Какие вопросы на собеседовании QA Manual Trainee?

    Я прошел много собеседований, не QA Manual, но эт не так важно.
    Есть адекватные собеседования на которых реально пытаются понять твои компетенции, а есть какая-то хрень. где люди не знают или не понимают как собеседовать и кто им нужен, и там могут спросить все что угодно.
    Лучше походить по реальным собеседованиям, чем готовится к некому мифическому.
    Ответ написан
    2 комментария
  • Как удалить повторяющися значения но оставить самый первый?

    Простое решение в лоб:
    ddd
    [(36, 'abc', 5158), (35, 'aaa', 4023), (44, 'aaa', 3756), (171, 'alc', 3262), (179, 'soc', 701), (42, 'abs', 3879), (43, 'abs', 531)]
    ddd.sort(key=lambda x: x[-1])
    ddd
    [(43, 'abs', 531), (179, 'soc', 701), (171, 'alc', 3262), (44, 'aaa', 3756), (42, 'abs', 3879), (35, 'aaa', 4023), (36, 'abc', 5158)]
    t = {v[-1]: v for v in ddd}
    t
    {531: (43, 'abs', 531), 701: (179, 'soc', 701), 3262: (171, 'alc', 3262), 3756: (44, 'aaa', 3756), 3879: (42, 'abs', 3879), 4023: (35, 'aaa', 4023), 5158: (36, 'abc', 5158)}
    Ответ написан
    3 комментария
  • Как считать количество выполненений методов импортированного класса?

    import json
    
    
    class Test:
        def method1(self):
            pass
    
        def method2(self):
            pass
    
    
    # Через оборачивания
    class CounterUseMethod:
        count_method = {}
    
        @classmethod
        def counter(cls, method):
            def wrapper(self, *args, **kwargs):
                name = f'{self.__class__.__name__}: {method.__name__}'
    
                if name not in cls.count_method:
                    cls.count_method[name] = 0
                cls.count_method[name] += 1
                return method(self, *args, **kwargs)
    
            return wrapper
    
    
    Test.method1 = CounterUseMethod.counter(Test.method1)
    Test.method2 = CounterUseMethod.counter(Test.method2)
    
    
    # Через наследование
    class Counter(Test):
        count_method = {}
    
        def method1(self):
            name = 'method1'
    
            if name not in self.count_method:
                self.count_method[name] = 0
            self.count_method[name] += 1
            return super().method1()
    
        def method2(self):
            name = 'method2'
    
            if name not in self.count_method:
                self.count_method[name] = 0
            self.count_method[name] += 1
            return super().method2()
    
    
    test = Test()
    test2 = Counter()
    
    for _ in range(10):
        test.method1()
        test2.method1()
    
    for _ in range(5):
        test.method2()
        test2.method2()
    
    print(json.dumps(CounterUseMethod.count_method, indent=4))
    print(json.dumps(test2.count_method, indent=4))
    Ответ написан
    Комментировать
  • Как распределить кортеж названий фильмов по их расписаниям?

    Можно сделать так:
    from pprint import pprint
    films = ('Форсаж: Хоббс и Шоу', 'Вельзевул', 'Приключения Реми')
    rasp = (
        (('10:00', 'Kino Forum'), ('10:00', 'Kino Forum'), ('10:00', 'Lumiera Cinema (ЦУМ)')),
        (('12:50', 'Chaplin MEGA Park'), ('23:50', 'Chaplin MEGA Alma-Ata')),
        (('10:00', 'Lumiera Cinema (ЦУМ)'), ('10:00', 'Nomad Cinema'))
    )
    result = [
        (k, *v)
        for k, r in zip(films, rasp)
        for v in r
    ]
    
    pprint(result)


    result

    [('Форсаж: Хоббс и Шоу', '10:00', 'Kino Forum'),
     ('Форсаж: Хоббс и Шоу', '10:00', 'Kino Forum'),
     ('Форсаж: Хоббс и Шоу', '10:00', 'Lumiera Cinema (ЦУМ)'),
     ('Вельзевул', '12:50', 'Chaplin MEGA Park'),
     ('Вельзевул', '23:50', 'Chaplin MEGA Alma-Ata'),
     ('Приключения Реми', '10:00', 'Lumiera Cinema (ЦУМ)'),
     ('Приключения Реми', '10:00', 'Nomad Cinema')]

    Ответ написан
    3 комментария
  • Запуск тестов с опции командной строки?

    Я бы более явно разметил все тесты mark.url1 .. mark.urln.
    Но если хотите пропускать тесты на основе фикстур то тогда вам в помощь pytest_collection_modifyitems

    def pytest_collection_modifyitems(items):
        mark = pytest.mark.skip('Test is not present in test run.')
        # Тут любая магия которая придет к вам в голову.
        for item in items:
            if item.config.getoption('url2') is None:
                item.add_marker(mark)
    
    # UPD я бы посмотрел, в сторону того что бы не пложить фикстуру request_get_service, а прокидывать ей url, 
    # запрашивая её в нужных местах,  что-то типо такого.
    #########################
    @pytest.fixture()
    def request_get_service(requests, url):
        return requests.get(url)
    
    
    #########################
    @pytest.fixture()
    def use_url2(request_get_service, requests):
        url = requests.config.getoption('url2')
        return request_get_service(requests, url)
    
    
    @pytest.fixture()
    def use_url3(request_get_service, requests):
        url = requests.config.getoption('url2')
        return request_get_service(requests, url)
    Ответ написан
    Комментировать
  • Есть ли в Python возможность нахождения пути в словаре до определенного значения?

    Вот пример кода который, поможем вам найти объект в неопределенной вложенности.
    Но придется допилить под свои нужды
    from pprint import pprint
    
    TRUE_COUNT = 2
    
    
    def yes(obj: dict, values: dict):
        obj_values = {v for v in obj.values() if isinstance(v, (str, int, float, tuple, bool))}
        return len(obj_values.intersection(values.values())) >= TRUE_COUNT
    
    
    def find(key, keys, obj, accept_values):
        find_obj = None
        if isinstance(obj, dict):
            if yes(obj, accept_values):
                find_obj = obj
            else:
                for key, value in obj.items():
                    find_obj = find(key, keys, value, accept_values)
                    if find_obj:
                        break
    
        elif isinstance(obj, list):
            for key, value in enumerate(obj):
                find_obj = find(key, keys, value, accept_values)
                if find_obj:
                    break
    
        if find_obj:
            keys.append(key)
            pprint(list(reversed(keys)))
            return find_obj
    
    
    for accept in my.values():
        pprint(find('', [], rr, accept))
    Ответ написан
    Комментировать
  • Как построить архитектуру для автотестов?

    Я насколько это возможно покажу как подхожу я к автотестам на АПИ.
    У нас есть пулл АПИшек и пулл Авторизаций для них, каждый из них это отдельный микросервис, написанный на разных языках python, jawa, go, в целом это не так важно. Есть документация по ним значит как формировать и отправлять и получать запросики понятно.

    # Условно у меня есть одна абстрация для всех классов, куда я сложил какие-то базовые вещи для всех.
    
    @dataclass
    class ApiAbstraction(ABC):
        config: Any = field(init=True) 
        session: ClientSession = field(init=True, default_factory=ClientSession)
    
        async def close(self):
            await self.session.close()
    
    # И есть разные классы, для авторизации и апи
    @dataclass
    class ApiBLABLA(ApiAbstraction):
        # Загрузить файл
        async def send_file(self, filepath: str):
            endpoint = f"app/files"
            new_url = urljoin(self.config.api, endpoint)
            headers = {"accept": JSON}
            file = os.path.abspath(filepath)
            data = {"file": open(file, "r")}
            raw_result = await self.session.post(new_url, headers=headers, data=data)
            result = await raw_result.json()
            response = get_response_instance(result)
            if response.success:
                file = FileUploadModel.init_from_data(response.result)
                return file
            return response
    
    # Условно класс для авторизации
    @dataclass
    class Auth(ApiAbstraction):
        async def login(self):
            endpoint = "auth/blabla"
            new_url = urljoin(self.config.auth, endpoint)
            headers = {}
            raw_response = await self.session.get(new_url, headers=headers)
            content = await raw_response.json(content_type=None)
            response = get_response_instance(content, AuthModel)
            return response
     
    # Для ответов у меня есть модели, в которые конвертируется JSON ответ. можно и напрямую работать, но нам захотелось через модели. 
    
    @dataclass
    class AuthModel(AbstractClass):
        key: str = ''


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

    В целом почти все тоже самое что и с UI тестами.
    Ответ написан
    5 комментариев
  • Python. Как получить уникальные значения из словаря по одному ключу?

    Я не до конца понял что вы хотите, но например можете сгруппировать по img_id, а дальше обрабатывайте как вам надо.
    obj
    obj = [
        {'_id': 'wZQlBGoBENgcYA5dUvr_',
         '_index': 'fh_images',
         '_score': 0.3617011156311892,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c9318/u298156/-6/y_84164775.jpg'},
         '_type': 'fh_image'},
        {'_id': 'wpQlBGoBENgcYA5dV_pJ',
         '_index': 'fh_images',
         '_score': 0.44313779433299844,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c11125/u298156/125130624/y_1d015950.jpg'},
         '_type': 'fh_image'},
        {'_id': 'x5QlBGoBENgcYA5da_pJ',
         '_index': 'fh_images',
         '_score': 0.44582819825057535,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c4475/u298156/-6/y_32e0b727.jpg'},
         '_type': 'fh_image'},
        {'_id': 'w5QlBGoBENgcYA5dWvrP',
         '_index': 'fh_images',
         '_score': 0.45485040641214125,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c11125/u298156/125130624/y_80599d36.jpg'},
         '_type': 'fh_image'},
        {'_id': 'xJQlBGoBENgcYA5dXvrv',
         '_index': 'fh_images',
         '_score': 0.4625495354012009,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c9318/u298156/125130624/y_ab5d368d.jpg'},
         '_type': 'fh_image'},
        {'_id': 'xpQlBGoBENgcYA5dZ_pU',
         '_index': 'fh_images',
         '_score': 0.4636520489656735,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c11187/u298156/-6/y_8e5cdd46.jpg'},
         '_type': 'fh_image'},
        {'_id': 'xZQlBGoBENgcYA5dY_oi',
         '_index': 'fh_images',
         '_score': 0.5156954172925243,
         '_source': {'img_id': '298156',
                     'img_url': 'https://img.com/c4422/u298156/-6/y_8458ec16.jpg'},
         '_type': 'fh_image'},
        {'_id': 'xJQKBGoBENgcYA5dKvQ5',
         '_index': 'fh_images',
         '_score': 0.5572724509457869,
         '_source': {'img_id': '299217',
                     'img_url': 'https://img.com/c10739/u299217/-6/y_19eb9a0c.jpg'},
         '_type': 'fh_image'},
        {'_id': 's5QgBGoBENgcYA5dtPla',
         '_index': 'fh_images',
         '_score': 0.5624892892097831,
         '_source': {'img_id': '298711',
                     'img_url': 'https://img.com/c308425/v308425711/3c/UJdRfCsT3fs.jpg'},
         '_type': 'fh_image'},
        {'_id': 'qpQpBGoBENgcYA5dyvui',
         '_index': 'fh_images',
         '_score': 0.5646689160902589,
         '_source': {'img_id': '298039',
                     'img_url': 'https://img.com/c5786/u298039/-6/y_e3bc7d5c.jpg'},
         '_type': 'fh_image'},
    ]
    import json
    from itertools import groupby
    
    result = {
        k: [(sub_obj['_score'], sub_obj['_source']['img_url']) for sub_obj in values]
        for k, values in groupby(obj, key=lambda x: x['_source']['img_id'])
    }
    print(json.dumps(result, indent=4))
    Ответ написан
    Комментировать
  • Номер строки, содержащей максимальное число одинаковых элементов?

    import random
    from collections import Counter
    
    M, N = 5, 5
    matrix = [[random.randrange(0, 10) for _ in range(M)] for _ in range(N)]
    
    # Посчитали количество повторов
    result = {
        i: sum(v for v in Counter(sub_list).values() if v > 1)
        for i, sub_list in enumerate(matrix)
    }
    print(result)
    
    # А дальше что нужно то и выводите.
    print(sorted(result, key=lambda key: result[key], reverse=True))
    print(max(result, key=lambda key: result[key]))
    Ответ написан
    Комментировать
  • Как создать словарь в Python из тхт файла, с 1 стобцом?

    Если вы хотите посчитать количество повторов, то используйте Counter
    from collections import Counter
    
    with open('tmp.txt') as f:
        print(Counter(f.read().split()))
    Ответ написан
    Комментировать
  • Как запустить тесты Pytest параллельно по категориям?

    Вот серьезно нет в офф документации?
    xdist
    --dist=loadscope: tests will be grouped by module for test functions and by class for test methods, then each group will be sent to an available worker, guaranteeing that all tests in a group run in the same process. This can be useful if you have expensive module-level or class-level fixtures. Currently the groupings can’t be customized, with grouping by class takes priority over grouping by module. This feature was added in version 1.19.
    --dist=loadfile: tests will be grouped by file name, and then will be sent to an available worker, guaranteeing that all tests in a group run in the same worker. This feature was added in version 1.21.
    Ответ написан