Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 5
1

Как последовательно итерировать по элементам списка?

13.06.2014, 21:12. Показов 2009. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дорогие друзья,

помогите, пожалуйста, исправить код. На входе имеем стихотворный текст типа:

Я вас любил, любовь еще, быть может,
В душе моей угасла не совсем.

В каждом стихе нужно выделить устойчивые пары слов (эта часть скрипта уже имеется).
Нужно, чтобы считало: , пропуская «может в», и то же самое с общим количеством пар: 6 пар для первой строки, 5 пар для второй строки и т. д.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
from math import log
"""Функции про логарифмы - для последующего подсчета устойчивости словосочетаний"""
def logL(p,k,n):
    if p == 0:
        return (n - k) * log(1 - p)
    elif p == 1:
        return k * log(p)
    else:
        return k * log(p) + (n - k) * log(1 - p)
def logLikehoodRatioBinormal(k1, n1, k2, n2):
    p1 = k1 / n1
    p2 = k2 / n2
    p = (k1 + k2) / (n1 + n2)
    return 2 * (logL(p1, k1, n1) + logL(p2, k2, n2) - logL(p, k1, n1) - logL(p, k2, n2))
"""ОТКРЫВАЕМ ФАЙЛ И НАРЕЗАЕМ ЕГО НА СТИХИ - ПОЛУЧАЕТСЯ СПИСОК СТИХОВ"""
fileObj =  open('C:/Texts/Verses/1.txt', 'r+', encoding='utf-8')
verseList = fileObj.readlines()
"""Задаем словари"""
A = {}
B = {}
AB = {}
N = 0
"""ОБЪЯСНЯЕМ ПИТОНУ, КАК ИТЕРИРОВАТЬ ПО ПОЛУЧЕННОМУ СПИСКУ СТИХОВ И КАК ОТТУДА ИЗВЛЕКАТЬ ОТДЕЛЬНЫЕ СЛОВА"""
"""Вот тут непонятно, как написать код так, чтобы в качестве inp Питон брал последовательно по строке из verseList. И действительно ли программа берет слова в пределах отдельных стихов? Но ответ какой-то получается"""
RUSSIAN_ALPHABET = set("йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ")
def clearWord(word):
    buff = []
    for char in word:
        if char == "ё":
            buff.append("ё")
        elif char in RUSSIAN_ALPHABET or (char == "-" and len(buff) > 0):
            buff.append(char)
    return "".join(buff).lower()
words = []
for verse in verseList:
    verse = verse.split()
    words.extend(clearWord(el) for el in verse if clearWord(el))
print(words)
"""Результат каждый раз - другой, хотя список words всегда один и тот же"""
for verse in range(len(verseList)-1):
    pair = words[verse], words[verse + 1]
    try:
        AB[pair] += 1
    except KeyError:
        AB[pair] = 1
    try:
        A[pair[0]] += 1
    except KeyError:
        A[pair[0]] = 1
    try:
        B[pair[1]] += 1
    except KeyError:
        B[pair[1]] = 1
    N += 1
raitings = []
for pair in AB:
    ab = AB[pair]
    anotb = A[pair[0]] - ab
    notab = B[pair[1]] - ab
    notanotb = N-A[pair[0]] - B[pair[1]] + ab
    raitings.append((pair, logLikehoodRatioBinormal(k1 = ab, n1 = ab + anotb, k2 = notab, n2 = notab + notanotb)))
raitings.sort(key = lambda x: x[1], reverse = True)
for el in raitings[:20]:
    print(el)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2014, 21:12
Ответы с готовыми решениями:

Как итерировать указатель на std::list?
Здравствуйте! Нужно проитерировать указатель на list хранящий касс точка и получить его элементы. ...

Как итерировать запрос без процедуры?
Добрый день Помогите убить дракона, процедуры и функции юзать запрещено :) Есть 2 таблицы: (т1 ...

Как получить доступ к элементам списка?
У меня есть список в который заносятся значения полей из БД private void...

Как к элементам списка прикрепить текстовые поля?
Мне нужно, чтобы элементы списка стали кнопками. При нажатии на них появляется текстовое поле в...

Как получить доступ к отдельным элементам списка
Добрый день, сделала простой проект, в котором отображается таблица даннных. У меня вопрос: Как...

7
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.06.2014, 21:57 2
cibershot, Во 1 обрамите присланный вами код тегами python, чтобы форматирование сохранить (в таком виде ни кто не будет разбираться с вашим кодом), во 2 лично я вообще не понял, что вы хотите сделать.

Добавлено через 30 минут
cibershot, Если отталкиваться от названия темы, а не от того, что вы внутри понаписали, то вот как можно обойти список.
Python
1
2
3
4
result = ['привет', 'солнце']
for word in result:
    for i in word:
        print(i)  # Делаем какие либо действия
0
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 5
13.06.2014, 22:00  [ТС] 3
Прошу прощения, да, понимаю, что надо просто разбить текст на строки и по очереди запускать алгоритм подсчета пар для каждой строки. Наваял такой скрипт, но что-то не так - нужно чтобы пары слов искались отдельно для каждой строки, а не по всему тексту.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
from math import log
"""Функции про логарифмы - для последующего подсчета устойчивости словосочетаний"""
def logL(p,k,n):
if p == 0:
return (n - k) * log(1 - p)
elif p == 1:
return k * log(p)
else:
return k * log(p) + (n - k) * log(1 - p)
def logLikehoodRatioBinormal(k1, n1, k2, n2):
p1 = k1 / n1
p2 = k2 / n2
p = (k1 + k2) / (n1 + n2)
return 2 * (logL(p1, k1, n1) + logL(p2, k2, n2) - logL(p, k1, n1) - logL(p, k2, n2))
"""ОТКРЫВАЕМ ФАЙЛ И НАРЕЗАЕМ ЕГО НА СТИХИ - ПОЛУЧАЕТСЯ СПИСОК СТИХОВ"""
fileObj = open('C:/Texts/Verses/1.txt', 'r+', encoding='utf-8')
verseList = fileObj.readlines()
"""Задаем словари"""
A = {}
B = {}
AB = {}
N = 0
"""ОБЪЯСНЯЕМ ПИТОНУ, КАК ИТЕРИРОВАТЬ ПО ПОЛУЧЕННОМУ СПИСКУ СТИХОВ И КАК ОТТУДА ИЗВЛЕКАТЬ ОТДЕЛЬНЫЕ СЛОВА"""
"""Вот тут непонятно, как написать код так, чтобы в качестве inp Питон брал последовательно по строке из verseList. И действительно ли программа берет слова в пределах отдельных стихов? Но ответ какой-то получается"""
RUSSIAN_ALPHABET = set("йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ ЭЯЧСМИТЬБЮЁ")
def clearWord(word):
buff = []
for char in word:
if char == "ё":
buff.append("ё")
elif char in RUSSIAN_ALPHABET or (char == "-" and len(buff) > 0):
buff.append(char)
return "".join(buff).lower()
words = []
for verse in verseList:
verse = verse.split()
words.extend(clearWord(el) for el in verse if clearWord(el))
print(words)
"""Результат каждый раз - другой, хотя список words всегда один и тот же"""
for verse in range(len(verseList)-1):
pair = words[verse], words[verse + 1]
try:
AB[pair] += 1
except KeyError:
AB[pair] = 1
try:
A[pair[0]] += 1
except KeyError:
A[pair[0]] = 1
try:
B[pair[1]] += 1
except KeyError:
B[pair[1]] = 1
N += 1
raitings = []
for pair in AB:
ab = AB[pair]
anotb = A[pair[0]] - ab
notab = B[pair[1]] - ab
notanotb = N-A[pair[0]] - B[pair[1]] + ab
raitings.append((pair, logLikehoodRatioBinormal(k1 = ab, n1 = ab + anotb, k2 = notab, n2 = notab + notanotb)))
raitings.sort(key = lambda x: x[1], reverse = True)
for el in raitings[:20]:
print(el)
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.06.2014, 22:21 4
Не могу понять в чем проблема, просто берете свой текст и проходите по нему циклом, в цикле для каждой строки считаете количество вхождений.
Python
1
2
3
inp = open('you_file')
for string in inp:
    count(string)  # В string находится одна строка стихотворения, она отправляется в гипотетическую функцию, которая подсчитывает количество вхождений.
Добавлено через 4 минуты
Цитата Сообщение от tsar925 Посмотреть сообщение
Во 1 обрамите присланный вами код тегами python
Текст из твоего исходного файла копировать надо было, ты код обрамил тегами только, копировал с форума и отступов в коде нет, а без отступов сам понимаешь ничего работать не будет.
0
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 5
13.06.2014, 22:21  [ТС] 5
Нет, попробую объяснить.

Изначально этот скрипт считал условный "рейтинг" наиболее часто повторяющихся в каком-либо тексте пар слов.
Он брал первое слово в списке word, в котором были все слова текста и начинал искать его сочетаемость с другими словами в тексте и так с каждым словом. Затем он выдавал первые 20 наиболее связанных друг с другом пар слов.

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

Я вас любил, любовь еще, быть может,
В моей душе угасла не совсем.

Программа должна считаешь: [я вас, вас любил … быть может, в моей, моей душе …], пропуская «может в», и то же самое с общим количеством пар: 6 пар для первой строки, 5 пар для второй строки и т. д. Надо просто разбить текст на строки и по очереди запускать алгоритм подсчета пар для каждой строки.

Код еще раз:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
from math import log
 
"""Функции про логарифмы - для последующего подсчета устойчивости словосочетаний"""
 
def logL(p,k,n):
    if p == 0:
        return (n - k) * log(1 - p)
    elif p == 1:
        return k * log(p)
    else:
        return k * log(p) + (n - k) * log(1 - p)
 
def logLikehoodRatioBinormal(k1, n1, k2, n2):
    p1 = k1 / n1
    p2 = k2 / n2
    p = (k1 + k2) / (n1 + n2)
    return 2 * (logL(p1, k1, n1) + logL(p2, k2, n2) - logL(p, k1, n1) - logL(p, k2, n2))
 
"""ОТКРЫВАЕМ ФАЙЛ И НАРЕЗАЕМ ЕГО НА СТИХИ - ПОЛУЧАЕТСЯ СПИСОК СТИХОВ"""
 
fileObj =  open('C:/Texts/Verses/1.txt', 'r+', encoding='utf-8')
verseList = fileObj.readlines()
 
"""Задаем словари"""
 
A = {}
B = {}
AB = {}
N = 0
 
"""ОБЪЯСНЯЕМ ПИТОНУ, КАК ИТЕРИРОВАТЬ ПО ПОЛУЧЕННОМУ СПИСКУ СТИХОВ И КАК ОТТУДА ИЗВЛЕКАТЬ ОТДЕЛЬНЫЕ СЛОВА"""
"""Вот тут непонятно, как написать код так, чтобы в качестве inp Питон брал последовательно по строке из verseList. И действительно ли программа берет слова в пределах отдельных стихов? Но ответ какой-то получается"""
 
RUSSIAN_ALPHABET = set("йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ")
 
def clearWord(word):
    buff = []
    for char in word:
        if char == "ё":
            buff.append("ё")
        elif char in RUSSIAN_ALPHABET or (char == "-" and len(buff) > 0):
            buff.append(char)
    return "".join(buff).lower()
 
words = []
 
for verse in verseList:
    verse = verse.split()
    words.extend(clearWord(el) for el in verse if clearWord(el))
 
print(words)
"""Результат каждый раз - другой, хотя список words всегда один и тот же"""
 
 
for verse in range(len(verseList)-1):
    pair = words[verse], words[verse + 1]
    try:
        AB[pair] += 1
    except KeyError:
        AB[pair] = 1
    try:
        A[pair[0]] += 1
    except KeyError:
        A[pair[0]] = 1
    try:
        B[pair[1]] += 1
    except KeyError:
        B[pair[1]] = 1
    N += 1
 
 
raitings = []
for pair in AB:
    ab = AB[pair]
    anotb = A[pair[0]] - ab
    notab = B[pair[1]] - ab
    notanotb = N-A[pair[0]] - B[pair[1]] + ab
    raitings.append((pair, logLikehoodRatioBinormal(k1 = ab, n1 = ab + anotb, k2 = notab, n2 = notab + notanotb)))
 
raitings.sort(key = lambda x: x[1], reverse = True)
for el in raitings[:20]:
    print(el)
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.06.2014, 22:33 6
Цитата Сообщение от cibershot Посмотреть сообщение
считать только те пары, которые встречаются внутри одной строки
Работая с файлом вот так:
Python
1
2
3
inp = open('out')
for string in inp:
    print(string, end='')
Он обрабатывается построчно, по этому не понимаю чего ты хочешь.
0
0 / 0 / 0
Регистрация: 13.06.2014
Сообщений: 5
13.06.2014, 22:40  [ТС] 7
Прикрепленный скрипт почему-то считает сочетаемость и слов из разных стихотворных строчек, хотя этого делать не должен. Вот это я имею в виду.
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
13.06.2014, 23:18 8
На сколько я понял ты в переменную words загнал все слова стиха и потом среди всего стиха ищешь совпадения. Вот тут как раз и ответ кроется, почему поиск осуществляется по всему стиху, а не по строчно.
В общем изучай цикл в строке 56.
1
13.06.2014, 23:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2014, 23:18
Помогаю со студенческими работами здесь

как осуществить доступ к доченим элементам объекта или списка?
Здравствуйте уважаемые форумчане! Подскажите как из массива типа объект иметь доступ к доченим...

Прибавить ко всем элементам списка максимальный элемент этого списка.
Прибавить ко всем элементам списка максимальный элемент этого списка. решите пожалуйста...

Сортировка списка, переопределение оператора произвольного доступа к элементам списка
Необходимо написать функции сортировки списка с элементами Doll по всем полям класса Doll методом...

Список: Как разобраться с типами данных и получить доступ к элементам списка?
входным параметром является список, который запихивают в метод следующим образом:...

Итерировать user-defined class : Vector
допустим, на входе имею CSV-файл (кстати вопрос - можно ли его разместить в проекте- чтобы после...

Проход по элементам списка
определить функцию ДОБАВЬ прибавляющую к элементам списка заданное число. (defun добавь (x y)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru