Удалить список из матрицы списка - Python - PullRequest
2 голосов
/ 20 февраля 2020

Я создал отсортированную матрицу с ID / одометрами / датой. Мне действительно нужно удалить весь список, где значение 0 находится на второй позиции. Я подготовил функцию и l oop, но, к сожалению, у меня все еще есть ошибка. Я сомневаюсь, что метод del [] используется правильно?

в zero_clear, если таблица [i] [1] == 0: ****

tablica = [
            [ 
            [21091705,  0,'30.06.2019'],
            [21091705,  0,'29.06.2019'],
            [21091705,  653842,'29.06.2019'],
            [21091705,  641701,'28.06.2019'],
            [21091705,  642000,'27.06.2019'],
            [21091705,  0,'25.06.2019'],
            [21091705,  642030,'25.06.2019'],
            [21091705,  642030,'25.06.2019'],
            [21091705,  637030,'25.06.2019'],
            [21091705,  0,'25.06.2019'],
            [21091705,  0,'17.05.2019'],
            [21091705,  641256,'25.06.2019']
            ],
            [
            [21091703,  487000,'30.06.2019'],
            [21091703,  461524,'29.06.2019'],
            [21091703,  0,'29.06.2019'],
            [21091703,  0,'28.06.2019'],
            [21091703,  427701,'28.06.2019'],
            [21091703,  429000,'27.06.2019']
            ],
            [
            [21091701,  421077,'30.06.2019'],
            [21091701,  453777,'29.06.2019'],
            [21091701,  0,'29.06.2019'],
            [21091701,  427701,'28.06.2019'],
            [21091701,  433123,'27.06.2019']
            ],
            [
            [21091704,  491000,'30.06.2019'],
            [21091704,  0,'29.06.2019'],
            [21091704,  474542,'29.06.2019'],
            [21091704,  427701,'28.06.2019'],
            [21091704,  427701,'28.06.2019'],
            [21091704,  0,'27.06.2019']
            ]
            ]

def zero_clear(tablica):

    for i in range(len(tablica)):

        if tablica[i][1] == 0:
            del tablica[i]

    return tablica

for item in tablica:
    zero_clear(item)

Ответы [ 5 ]

1 голос
/ 20 февраля 2020

если вы удаляете элементы из списка элементов tablica во время итерации (используя for l oop), вы заканчиваете переходить к следующему элементу для каждого удаленного элемента, чтобы исправить проблему, которую вы можете использовать while l oop или создайте новый список:

1), используя while l oop

def zero_clear(tablica):
    i = 0
    while i < len(tablica):
        if tablica[i][1] == 0:
            del tablica[i]
        else:
            i += 1

for item in tablica:
    zero_clear(item)

2), создав новый список

def zero_clear(tablica):

    new_list = []

    for l in tablica:
        if l[1] != 0:
            new_list.append(l)

    return new_list




for item in tablica:
    item[:] = zero_clear(item)

или создание нового элемента с использованием понимания списка:

for item in tablica:
    item[:] = [l for l in item if l[1] != 0]

или создание совершенно нового списка с использованием понимания списка:

tablica = [[l for l in item if l[1] != 0] for item in tablica]

вывод:

[[[21091705, 653842, '29.06.2019'],
  [21091705, 641701, '28.06.2019'],
  [21091705, 642000, '27.06.2019'],
  [21091705, 642030, '25.06.2019'],
  [21091705, 642030, '25.06.2019'],
  [21091705, 637030, '25.06.2019'],
  [21091705, 641256, '25.06.2019']],
 [[21091703, 487000, '30.06.2019'],
  [21091703, 461524, '29.06.2019'],
  [21091703, 427701, '28.06.2019'],
  [21091703, 429000, '27.06.2019']],
 [[21091701, 421077, '30.06.2019'],
  [21091701, 453777, '29.06.2019'],
  [21091701, 427701, '28.06.2019'],
  [21091701, 433123, '27.06.2019']],
 [[21091704, 491000, '30.06.2019'],
  [21091704, 474542, '29.06.2019'],
  [21091704, 427701, '28.06.2019'],
  [21091704, 427701, '28.06.2019']]]
1 голос
/ 20 февраля 2020

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

def zero_clear(tablica):
   count = 0
   while count < len(tablica):
      if tablica[count][1] == 0:
         del tablica[count]
      else:
         count += 1 
   return tablica


for item in tablica:
   zero_clear(item)
print(tablica)
0 голосов
/ 20 февраля 2020

Вот решение с использованием библиотеки pandas:

import pandas as pd


new_tablica = []
column_names = ['col1', 'col2', 'col3']

for matrix in tablica:
    df = pd.DataFrame(matrix, columns=column_names) 

    df = df[df['col2'] > 0]
    new_tablica.append(df.values.tolist()) 

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

0 голосов
/ 20 февраля 2020

Мне кажется, что что-то пошло не так, потому что после изменения матрицы, когда я использую простой цикл for, чтобы увидеть результат, он должен выглядеть следующим образом (без списков с 0 на второй позиции):

    for ele in tablica:
        for item in ele:
            print(item)

[21091705, 653842, '29.06.2019']
[21091705, 641701, '28.06.2019']
[21091705, 642000, '27.06.2019']
[21091705, 642030, '25.06.2019']
[21091705, 642030, '25.06.2019']
[21091705, 637030, '25.06.2019']
[21091705, 641256, '25.06.2019']
[21091703, 487000, '30.06.2019']
[21091703, 461524, '29.06.2019']
[21091703, 427701, '28.06.2019']
[21091703, 429000, '27.06.2019']
[21091701, 421077, '30.06.2019']
[21091701, 453777, '29.06.2019']
[21091701, 427701, '28.06.2019']
[21091701, 433123, '27.06.2019']
[21091704, 491000, '30.06.2019']
[21091704, 474542, '29.06.2019']
[21091704, 427701, '28.06.2019']
[21091704, 427701, '28.06.2019']

Когда я использую этот цикл для просмотра выходных данных после смены матрицы, выходные данные намного сложнее:

tablica = [[[row for i in range(len(item))] for row in item if row[1] != 0] for item in tablica]

Выходные данные:

for ele in tablica:
      for item in ele:
                print(item)

[[21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019'], [21091705, 653842, '29.06.2019']]
[[21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019'], [21091705, 641701, '28.06.2019']]
[[21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019'], [21091705, 642000, '27.06.2019']]
0 голосов
/ 20 февраля 2020

Ваша проблема в том, что вы удаляете элементы во время чтения таблицы. Каждый раз, когда вы удаляете элемент, таблица становится короче, поэтому в итоге вы получите ошибку list index out of range.

Вместо этого вы можете сделать это следующим образом:

tablica = [[[row for i in range(len(item))] for row in item if row[1] != 0] for item in tablica]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...