Как выполнить операцию сортировки в python

108
11

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

У меня есть класс "SequencePattern", который идентифицирует один элемент (токен или разделитель) в наборе токенированных предложений, где каждый SequencePattern имеет атрибут списка "вхождения", состоящий из кортежей (n_sentence, n_element), где этот конкретный элемент действителен. Класс SequencePattern имеет поле уровня класса, seq_patterns (set), где хранятся все отдельные экземпляры SequencePattern.

На этом этапе обработки у меня есть только одноэлементные SequencePatterns, и вытеснили все такие SequencePatterns, имеющие <2 вхождения. Но SequencePattern является подклассом tuple и теперь идея состоит в том, чтобы найти "два элемента" SequencePatterns.

Следующее, что мне нужно сделать, это пройти через все одноэлементные последовательности SequencePatterns, которые остаются после прополки, идентифицируя пятна, в которых вы находите два (или более) смежных вхождения в том же предложении, то есть где n_sentence одинаково, а n_element отличается на 1,

Поэтому мне нужно сделать что-то в этом направлении:

occurrences_by_text_order = sorted( SequencePattern.seq_patterns.occurrences )

... но, конечно, это не работает: я получаю

AttributeError: 'set' object has no attribute 'occurences'

Как-то мне нужно выполнить итерацию всех SequencePatterns в seq_patterns, а затем для каждой "вложенной" итерации всех вхождений для каждого из них... и мне нужно представить эту массу доставленных кортежей (n_sentence, n_element) в sorted функция.

Я не опытный Pythonista, но у меня есть подозрение, что это работа для генератора (?). Может ли кто-нибудь помочь?

спросил(а) 2021-01-25T16:09:10+03:00 4 месяца, 4 недели назад
1
Решение
63

def get_occurrences():
for seq_patt in SequencePattern.seq_patterns:
for occurrence in seq_patt.occurrences:
yield occurrence
occurrences_by_text_order = sorted( get_occurrences() )

Затем выдается список всех двухэлементных последовательностей, которые могут встречаться более одного раза (теперь мы знаем, что нет возможности двухэлементных последовательностей с частотой> 1, встречающихся где-либо еще):

prev_occurrence = None
for occurrence in sorted( occurrence for seq_patt in SequencePattern.seq_patterns for occurrence in seq_patt.occurrences ):
if prev_occurrence and ( occurrence[ 0 ] == prev_occurrence[ 0 ] ) and ( occurrence[ 1 ] - prev_occurrence[ 1 ] == 1 ):
print( '# prev_occurrence %s occurrence: %s' % ( prev_occurrence, occurrence, ))
prev_occurrence = occurrence

ответил(а) 2021-01-25T16:09:10+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема