@ddgryaz

Почему возвращается пустой список?

Доброго времени суток!

import pandas as pd
import re

excel = pd.read_excel('data.xlsx', index_col=None, usecols='A, C').to_dict()
pattern = re.compile('Автобус')
who_proposed_commisions = excel['Транспорт']
comissions_number = excel['номер']
commisions = list(zip(who_proposed_commisions.values(), comissions_number.values()))
wick_successfully = []
wick_not_successfylly = []
for commision, comission_number in commisions:
    if not pattern.search(commision):
        wick_successfully.append(comission_number)
    else:
        wick_not_successfylly.append(comission_number)
wick_successfully = filter(lambda x: x not in wick_not_successfylly, wick_successfully)
print(list(wick_successfully))


На выходе я получаю список:
[2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2026, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034, 2034]


Пытаюсь удалить дубликаты и получить новый список:
woduplicates = list(set(wick_successfully)) 
print(woduplicates)

Но получаю пустой список, как мне вернуть список без дубликатов? Порядок абсолютно не важен.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@o5a
Т.к. filter возвращает итератор, то повторное использование его результатов возвращает пусто.
Насколько понял пытались сделать так
wick_successfully = filter(lambda x: x not in wick_not_successfylly, wick_successfully)
print(list(wick_successfully))
woduplicates = list(set(wick_successfully)) 
print(woduplicates)

После строки print(list(wick_successfully)) итератор wick_successfully уже пуст, поэтому последующие его вызовы и возвращают пустой список.

В данном случае будут работать варианты:
1. не использовать print(list(wick_successfully))
2. сразу получить список из фильтра
wick_successfully = list(filter(lambda x: x not in wick_not_successfylly, wick_successfully))

3. вообще не использовать фильтр, а сделать то же самое через list comprehension
wick_successfully = [x for x in wick_successfully if x not in wick_not_successfylly]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix
yellow
filter возвращает итератор, когда вы делали
print(list(wick_successfully))
то получали список.

Во втором же случае вы забыли сначала сделать list(), перед применением set() и по итогу пытались сделать set() из итератора:
woduplicates = list(set(wick_successfully)) 
print(woduplicates)


Так что правильно было бы
woduplicates = list(set(list(wick_successfully))) 
print(woduplicates)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы