Задать вопрос
  • Как исправить ошибку при выводе матрицы?

    includedlibrary
    @includedlibrary
    int input(int *n, int *m, int ***matrix, int *flag) {
        char ch;
        // Зачем считывать ch, я не понял. Также проверка у вас неправильная.
        // scanf возвращает число считанных элементов, вам надо сравнивать это
        // число с 2, так как вы считываете n и m.
        // if(scanf("%d%d", n,m) != 2 || *n <= 0 || *m <= 0)
        //     return 0;
        if (((scanf("%d%d%c", n,m, &ch)) || (ch != '\n')) && ((*n <= 0) || (*m <=0))){
            *flag =0;
            // Тут просто сделать return 0;
        } else{
            // Всё, что ниже, нужно вынести из else блока, а сам else блок убрать
            **matrix = (int *)malloc((*n) * sizeof(int*));
            for (int i; i < *n; i++ ){
            for (int j; j < *m; j++) {
                **matrix = (int *)malloc((*n * *m) * sizeof(int));
    
                // if(scanf("%d", &((*matrix)[i][j])) != 1)
                //     return 0;
                if (scanf("%d", matrix[i][j])) {
                    
                } else {
                   *flag =0;
                }
            }
        }
        } 
    // return 1;
    return *flag =1;
    }


    Тут вы используете неверный указатель:
    scanf("%d", matrix[i][j]) // так не надо
    scanf("%d", &((*matrix)[i][j])) // надо так
    scanf("%d", *(*matrix + i) + j) // или так


    Не понятно, зачем flag делать указателем, можно объявить его в input, присвоить 1 или 0 и вернуть. Кстати, у вас сравнение неверное, сейчас возвращается всегда 1:
    // очевидно, имелось в виду *flag == 1
    // Но вообще, можно просто вернуть *flag.
    // Или везде, заменить присваивание *flag = что_то на return что_то
    return *flag =1;


    Так же у вас абсолютно неверно выделяется память:
    // Тут каст неверный, должно быть (int**),
    // Но в си касты void* к другим типам указателей
    // можно опускать. Также нужна лишь одна операция разыменовывания для matrix
    **matrix = (int *)malloc((*n) * sizeof(int *));
    // Забыли присвоить 0 в i
    for (int i; i < *n; i++) {
      // А этот цикл надо сделать после выделения памяти для m столбцов
      // для ввода данных в выделенную память. Тут тоже забыли присвоить 0 в j.
      for (int j; j < *m; j++) {
        // Вот тут вы перезаписываете первую строку matrix,
        // хотя хотели выделить m столбцов для i строки.
        // До перазаписи дело, правда, не дойдёт, так как на предыдущем шаге
        // вы сделали два разыменовывания вместо одного и уже словили segfault
        **matrix = (int *)malloc((*n * *m) * sizeof(int));
        // ...
      }
    }


    Исправляется элементарно:
    *matrix = malloc(*n * sizeof(int*));
    for (int i = 0; i < *n; i++) {
        // *matrix - указатель на двумерный массив,
        // *matrix + i - указатель на строку (которая является указателем на одномерный массив),
        // *(matrix + i) = ... - присваивание указателю на строку адреса выделенной памяти
        *(*matrix + i) = malloc(*m * sizeof(int));
        for(int j = 0; j < *m; j++) {
            // Ввод данных
        }
    }


    Ну и совет на будущее - не используйте scanf, хотя проблема сейчас и не в ней. Желательно проверять результат malloc на NULL, чтобы корректно завершать программу в случае нехватки памяти, а не выводить segfault, или не завершать, а просто вызвращать ошибку и продолжать работу дальше. Также не используйте конструкции вида int ***matrix, лучше сделайте функцию, которая принимает n и m и возвращает указатель на матрицу, также сделайте отдельную функцию для ввода значений и вывода.

    int** create_matrix(int n, int m);
    bool read_matrix(int n, int m, int **matrix);
    void write_matrix(int n, int m, int **matrix);
    void free_matrix(int n, int m, int **matrix);


    Ну и 2 мерный массив можно сделать через одномерный, так будет меньше вызовов malloc, а значит потенциально меньше обращений к ядру. Также, если данные всего двумерного массива будут лежать последовательно, велика вероятность, что в циклах большая часть значений будет браться из кэша, а не из памяти, что даст выигрыш в скорости.
    int n = 10, int m = 5;
    int *matrix = malloc(sizeof(int) * n * m);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            matrix[i * m + j] // обращение к элементу в i строке в j столбце
        }
    }


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

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри это происходит потому что мы ставим индексом ИМЯ и его же меняем, можно ли это обойти, конечно элементарно. Все оставляешь как есть вот здесь добавляем параметр
    df = pd.read_csv('directory2.csv').set_index('Имя', drop=False).rename_axis('_Имя', axis=0)
    что бы у нас колонка имя не пропадала, и меняем имя у индекса, что бы он отличался от имени колонки.
    ну и при записи в файл индекс не пишем что бы ничего не дублировалось.
    df.to_csv('directory2.csv', index=False)

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

    И будь внимателен при парсинге ввода, там где указываешь имена колонок, если ты введешь колонку которой нет он ее просто добавит новой и все. df.columns должен содержать fields_to_change, по этому может добавочный небольшой защитный код написать придется, что бы например регистры не перепутались, пробелы лишние не оказались, можешь даже проверку ввести на ввод что пользователь ввел существующие колонки. Имена колонок лежат в df.columns
    Ответ написан
    3 комментария
  • Как в Python можно изменить запись в CSV?

    Vindicar
    @Vindicar
    RTFM!
    Нет, по-простому нельзя. Единственный простой подход (который показал выше Максим Припадчев) - загрузить целиком в память, там изменить, потом выгрузить назад. Для больших CSV файлов это ресурсоёмко.

    CSV вообще не предназначен для долговременного хранения данных - скорее, для импорта/экспорта.

    Ты мог бы попытаться использовать методы tell() и seek(), чтобы "запомнить" позицию удаляемой строки, а затем в цикле копировать всё что идёт после, "пододвинув" содержимое внутри файла, а потом уже дописать в конец изменённую строку. Но это всё равно долго.

    Лучше импортируй файл в базу SQLite, и работай в дальнейшем уже с ней.
    Ответ написан
    3 комментария
  • Как в Python можно изменить запись в CSV?

    Maksim_64
    @Maksim_64
    Data Analyst
    Нет ничего проще для такой задачи чем использовать pandas.
    Вот сделал игрушечный пример, сначала создаю csv в первой части для демонстрации, потом обновляю любые подсеты данных, при вводе пользователя.
    import pandas as pd
    # Первая часть создание файла
    df = pd.DataFrame({
        'Name':['Petr','Maks','Aleksandr'],
        'Age':[30,40,50],
        'Salary':[500,700,600]
    })
    df.to_csv('data.csv', index=False)
    
    # Вторая часть обновление
    name = input('Введите Имя, чьи данные хотите изменить?  ')
    fields_to_change = input('Какие данные Вы хотите изменить? например Age, Salary: ').split(',')
    data_to_update = {}
    for field in fields_to_change:
        data_to_update[field] = input(f'Введите {field}: ')
    
    df = pd.read_csv('data.csv').set_index('Name')
    df.loc[name, fields_to_change] = data_to_update
    df.to_csv('data.csv')
    print('Спасибо, данные обновлены')

    Вторая часть это непосредственно код который будет обновлять. То есть та часть которая тебя интересует.
    Ответ написан
    2 комментария
  • Почему не запускается manage.py?

    Разумеется нужно сначала перейти в директорию, в которой находится файл manage.py
    # Сначала переходим в нужную директорию
    cd your_project_name
    # А затем
    python manage.py runserver
    Ответ написан
    Комментировать
  • Как объединить элементы списка, убрав дубликаты?

    aRegius
    @aRegius
    Python Enthusiast
    from collections import defaultdict
    
    data = defaultdict(list)
    
    for info in your_list:
    	  key = tuple(info[:2])
    	  for item in info:
    		    if item not in data[key]:
    			      data[key].append(item)
    
    new_list = list(data.values())
    Ответ написан
    Комментировать
  • Как разделить элементы списка?

    @zyusifov11
    new_arr = []
    i=3
    for my_list in range(0,i):
        if my_list[i]!= "":
            new_arr.append(my_list[i])
    Ответ написан
    Комментировать
  • Как разделить элементы списка?

    0xD34F
    @0xD34F
    arr[0].split(' ') + arr[3:]
    Ответ написан
    Комментировать
  • Как разделить элементы списка?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    my_list = ['Иванов Иван Иванович' ,'','', 'Больница', 'Исполняющий обязанности главного врача']
    name = my_list[0].split()
    name.extend(my_list[3:])
    print(name)

    ['Иванов', 'Иван', 'Иванович', 'Больница', 'Исполняющий обязанности главного врача']

    Берем первый элемент из списка, и разделяет по умолчанию(по пробелу). Потом получившийся список расширяем главным списком, только пропускаем 3 первые элемента.
    Ответ написан
    Комментировать
  • Почему PyCharm выдает ошибку, что файл или каталог отсутствуют, хотя файлы есть?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Или список выдает только имена файлов, а не сами файлы

    Верно, только названия файлов.

    Вы получаете только имя файла, вам же нужен полный путь до него. Склейте название файла с
    os.path.join(os.getcwd(), PHOTO_FOLDER)
    Ответ написан
    Комментировать
  • Как написать код для преобразования произвольного списка в словарь?

    @dmtrrr
    Backend developer
    from itertools import zip_longest
    
    l = ['2018-01-01', 'yandex', 'cpc', 100]
    
    for z in zip_longest(*[iter(l)] * 4):
        first, second, third, forth = z
        print({first:{second:{third:forth}}})
    Ответ написан
    2 комментария
  • Как написать код для преобразования произвольного списка в словарь?

    0xD34F
    @0xD34F
    d = arr[-1]
    for n in arr[-2::-1]:
      d = { n: d }
    Ответ написан
    Комментировать