Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 20, 2019 18:52:17

AntiVegan
Зарегистрирован: 2019-01-20
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

Здравствуйте! Проблема в следующем :
Имеется список A с определенными строками -

 A [a, b, c, d, e]
и список B, который содержит много других списков -
 B [[1,2,3,b,4,5] , [1,2,3,f,4,5] , [1,2,3,c,4,5] , [1,2,3,e,4,5]]
Если обратить внимание, то видно, что некоторые списки B содержат элементы из списка A и все они идут под индексом 3 внутри списка. У меня никак не получается создать цикл, при котором перебирался бы каждый элемент из списка A и сравнивался бы с каждым 3 элементом каждого списка внутри B и в случае, если такое совпадение будет найдено, нужно чтобы этот список внутри B удалялся, чтобы в итоге получить B со списками в которых под индексом 3 не будет элементов из A.

Извиняюсь за такую замороченную подачу. Ниже мой код.

 sort_sb = ['яблоки', 'мандарины', 'бананы']                    # названия элементов изменил для понятности :)
def sb():
    d = 0
    s = 0
    while d <= int(len(data)):
        if sort_sb[s] == data[d][3]:
            del data[d]
        elif sort_sb[s] != data[d][3]:
            s += 1
        elif sort_sb[s] != data[d][3] and s == len(sort_sb):
            d += 1
            s = 0
Ничего не работает, возвращает - IndexError: list index out of range и я не понимаю почему…

Офлайн

#2 Янв. 20, 2019 19:21:37

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

AntiVegan
list index out of range и я не понимаю почему…
да черт его разберет, у вас “s” вообще никак не контролируеться(да-да, ваш второй elif никогда не сработает), он просто увеличивается каждый раз кода
 sort_sb[s] != data[d][3]
, а sort_sb у вас имеет длинну 3, вот после четвертого несовпадения оно вам и выдаст IndexError.
Вы вообще какой ЯП до этого учили? пора вам узнать что такое оператор “in” и что по списку можно пройтись и не используя индексы.
 A = ['a', 'b', 'c', 'd', 'e']
B =[[1,2,3,'b',4,5] , [1,2,3,'f',4,5] , [1,2,3,'c',4,5] , [1,2,3,'e',4,5], [1,2,3,4,5,6]]
def sb(exl_lst, in_lst):
    res_lst = []
    for lst in in_lst:
        if lst[3] not in exl_lst:
            res_lst.append(lst)
    return res_lst
print(sb(A, B))
>>> 
[[1, 2, 3, 'f', 4, 5], [1, 2, 3, 4, 5, 6]]
>>> 



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 20, 2019 19:32:02)

Офлайн

#3 Янв. 20, 2019 20:04:12

AntiVegan
Зарегистрирован: 2019-01-20
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

Питон это мой первый язык. Ваш способ похоже мне не подойдет, наверное вы меня не так поняли. Постараюсь объяснить более подробно. Представьте, что список B это таблица, и каждый список внутри B - это строка таблицы в которой каждый индекс - это данные из строки. К примеру индекс 0 - это дата заказа, индекс 1 - это дата доставки заказа, индекс 2 - имя менеджера, который принял заказ, индекс 3 - наименование товара ( например ябоки, мандарины, бананы и тд) и так далее!! В итоге мы получаем список B примерно такого содержания -

 [['17.01.19' , '19.01.19' , 'Василий' , 'яблоки' , '20кг' , 'безнал'] , ['15.01.19' , '16.01.19' , 'Анастасия' , 'груши' , '3кг' , 'нал'] , ['11.01.19' , '15.01.19' , 'Сергей' , 'бананы' , '8кг' , 'безнал'] , ['19.01.19' , '20.01.19' , 'Петр' , 'кокосы' , '40кг' , 'нал']]
Далее у меня есть список A, вы можете считать его списком исключений -
 ['яблоки' , 'бананы' , 'киви' , 'кокосы']

Мне нужно получить список B, в котором будут отсутствовать списки, в которых каждый 3й индекс совпадал с одним из значений из списка А. Получается на выходе я должен получить измененный список B такого содержания -
 [['15.01.19' , '16.01.19' , 'Анастасия' , 'груши' , '3кг' , 'нал']]

Отредактировано AntiVegan (Янв. 20, 2019 20:26:39)

Офлайн

#4 Янв. 20, 2019 20:35:46

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

AntiVegan
Ваш способ похоже мне не подойдет, наверное вы меня не так поняли.
хммм… А по моему все работает именно так как вы описали.
 B = [['17.01.19' , '19.01.19' , 'Василий' , 'яблоки' , '20кг' , 'безнал'] , ['15.01.19' , '16.01.19' , 'Анастасия' , 'груши' , '3кг' , 'нал'] , ['11.01.19' , '15.01.19' , 'Сергей' , 'бананы' , '8кг' , 'безнал'] , ['19.01.19' , '20.01.19' , 'Петр' , 'кокосы' , '40кг' , 'нал']]
A =  ['яблоки' , 'бананы' , 'киви' , 'кокосы']
def sb(exl_lst, in_lst):
    res_lst = []
    for lst in in_lst:
        if lst[3] not in exl_lst:
            res_lst.append(lst)
    return res_lst
B =sb(A, B)
print(B)
>>> 
[['15.01.19', '16.01.19', 'Анастасия', 'груши', '3кг', 'нал']]
>>> 



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 20, 2019 20:36:18)

Офлайн

#5 Янв. 20, 2019 20:38:13

AntiVegan
Зарегистрирован: 2019-01-20
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

хммм… А по моему все работает именно так как вы описали.

Спасибо Вам большое, извиняйте новичка

Отредактировано AntiVegan (Янв. 20, 2019 20:39:55)

Офлайн

#6 Янв. 21, 2019 02:01:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

  
>>> a = ['a', 'b', 'c', 'd', 'e']
>>> b = [[1, 2, 3, 'b', 4, 5],
...      [1, 2, 3, 'f', 4, 5],
...      [1, 2, 3, 'c', 4, 5],
...      [1, 2, 3, 'e', 4, 5],
...      [1, 2, 3, 4, 5, 6]]
>>> out = [i for i in b if i[3] not in a]
>>> out
[[1, 2, 3, 'f', 4, 5], [1, 2, 3, 4, 5, 6]]
>>>



Офлайн

#7 Янв. 23, 2019 17:50:18

AntiVegan
Зарегистрирован: 2019-01-20
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнение элементов списка с элементами вложенных списков.

Спасибо py.user.next ! Ваш способ выручил с другой проблемой!!!!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version