как получить доступ к списку внутри функции, не возвращая его?

#python #list

#python #Список

Вопрос:

Итак, я случайно забыл включить оператор return в свой метод, и он только что закончил работу через 10 часов, поэтому я не хочу запускать его снова. Есть ли способ получить доступ к wordlist внутренней части этой функции?

 def rm_foreign_chars(corpus):
    wordlist=[]
    for text in corpus:
        for sentence in sent_tokenize(text):
            wordlist.append(sentence)
            for word in word_tokenize(sentence):
                for c in symbols:

                    if c in word:
                        if sentence in wordlist:
                            wordlist.remove(sentence)
                            break

  

Символы — это список символов: symbols = '฿‑‒–—―‖†‡•‰⁰⁷⁸₂₣℃™→↔∆∙≤⋅─■□▪►▼●◦◾★☎☺♣♦✓✔❖❗➡⠀ⱻ�ₒ'1

Комментарии:

1. Нет. Он исчез.

2. Исправьте вашу ошибку и начните повторный запуск.

3. rip list, вот почему вы тестируете свои функции перед внедрением!

4. После завершения функции локальные переменные собираются как мусор, поэтому, вероятно, нет. Для будущих повторов, вместо того, чтобы добавлять каждое предложение в список, а затем удалять его, если оно содержит какой-либо символ в любом из его слов, почему бы просто не записать каждое предложение, в котором нет символа, в некоторый файл? Нет риска потери результатов, даже на полпути, и меньше сложностей, поэтому это должно быть намного быстрее.

5. У вас есть действительно запутанный и неэффективный способ фильтрации предложений с символами. Это делает много ненужной работы. Очистите это, и следующий запуск должен быть намного быстрее, чем 10 часов.

Ответ №1:

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

 def rm_foreign_chars(corpus):
    wordlist=[]
    for text in corpus:
        for sentence in sent_tokenize(text):
            if not any(c in word for word in word_tokenize(sentence) for c in symbols):
                wordlist.append(sentence)
    return wordlist
  

Вы также можете создать wordlist глобальную переменную. Единственная причина, по которой я предлагаю сделать его глобальным, связана с тем, как долго выполняется функция (27 минут — это все еще много времени) Если функция завершается с ошибкой до завершения, вы все равно можете получить что-то из wordlist .

 def rm_foreign_chars(corpus):
    global wordlist
    for text in corpus:
        for sentence in sent_tokenize(text):
            if not any(c in word for word in word_tokenize(sentence) for c in symbols):
                wordlist.append(sentence)
    return wordlist

wordlist=[]

rm_foreign_chars(...)
# use wordlist here
  

Комментарии:

1. спасибо, это заняло от 10 часов до 27 минут! были ли накладные расходы вызваны функцией remove()?

2. @mojbius вероятно, комбинация удаления и if sentence in wordlist . Рад, что у вас все получилось

Ответ №2:

Невозможно сделать это без возврата списка. Альтернативой было бы создать класс, содержащий функцию, и сохранить список как атрибут self .

 class Characters:
    def __init__(self, corpus):
        self.corpus = corpus
        self.wordlist = []

    def foreign_chars(self):
        pass
        # Function code goes here
        # Be sure to replace corpus and wordlist
        # With their respective self attributes

chars = Characters()
chars.foreign_chars()
words = chars.wordlist
  

Обратитесь к другим ответам и комментариям, чтобы оптимизировать свой код.