Как преобразовать список, добавьте с помощью for, если elif для понимания списка - PullRequest
0 голосов
/ 31 марта 2020

Я хотел бы преобразовать код добавления в список с помощью mulitple для и, если, elif, для понимания списка. Я пытался, но работал только temp_list. temp_list2 не работает должным образом

Исходный код

temp_list = []
temp_array = accd['ACCD_SEQ'].values
temp_list = [i for i in temp_array if len(accd[accd['ACCD_DTL'].str.contains(i)]) != 0]

temp_list2 = []

for i in temp_list:
    if len(accd[accd['ACCD_DTL'].str.contains(i)]) == 1:
        temp_list2.append(i)
    elif len(accd[accd['ACCD_DTL'].str.contains(i)]) > 1:
        for j in range(len(accd[accd['ACCD_DTL'].str.contains(i)])):
            temp_list2.append(i)
    else:
        pass

Моя пробная версия

temp_list2 = [i if len(accd[accd['ACCD_DTL'].str.contains(i)]) == 1 else i for j in range (len(accd[accd['ACCD_DTL'].str.contains(i)])) if len(accd[accd['ACCD_DTL'].str.contains(i)]) > 1 for i in temp_list

В этом коде написано "UnboundLocalError: локальная переменная 'i', на которую ссылаются до назначения"

Кто-нибудь может помочь это исправить?

1 Ответ

0 голосов
/ 31 марта 2020

Давайте рассмотрим следующую функцию sumlists, которая «выравнивает» числовые двумерные списки, беря сумму значений в каждой строке, которые больше 1:

def sumlists(lst):
    new_lst = []

    for i in range(len(lst)):
        sum_ = 0

        for j in range(len(lst[i])):
            if lst[i][j] > 1:
                sum_ += lst[i][j]

        new_lst.append(sum_)

    return new_lst

Например, , если lst равно:

lst = [
        [1, 2, 3],
        [4, 5, 1, 6],
        [7, 1]
]

, результат будет:

[5, 15, 7]

Функция имеет два вложенных цикла for с индексами i и j для прохождения lst строк и столбцов соответственно. Прежде чем перейти к значениям в каждой строке, нам нужно определить переменную, в данном случае sum_, для хранения суммы до значения jth в строке ith . Условие if lst[i][j] > 1: запрещает добавление любого числа меньше 2 к sum_. Наконец, когда все значения в строке ith пройдены, полученная сумма добавляется в «плоский» список (new_list). С этим давайте разберем всю эту информацию, чтобы перейти от определения функции к пониманию списка.

Шаг 1. Строка для l oop:

arr[i] for i in range(len(arr))

Шаг 2. столбец для l oop:

arr[i][j] for j in range(len(arr[i]))] for i in range(len(arr))

Шаг 3. Условие ради суммы, значения больше единицы возвращаются, в противном случае 0:

arr[i][j] if arr[i][j] > 1 else 0 for j in range(len(arr[i]))] for i in range(len(arr))

Шаг 4. sum: sum: добавление всех значений в [arr[i][j] if arr[i][j] > 1 else 0 for j in range(len(arr[i]))]

sum([arr[i][j] if arr[i][j] > 1 else 0 for j in range(len(arr[i]))]) for i in range(len(arr))

Шаг 5. добавьте суммы к new_lst:

↓ here                                                                                        ↓ here
[sum([arr[i][j] if arr[i][j] > 1 else 0 for j in range(len(arr[i]))]) for i in range(len(arr))]

Я надеюсь, что это отвечает на ваш вопрос.

...