сделать шаг назад и шаг вперед в цикле с питоном - PullRequest
1 голос
/ 16 марта 2019

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

['les','engage', '*', 'ment', 'de','la'] 

Я хочу объединить 'eng' и 'ment', а вывод (engagement) должен быть проверен словарем. Если в словаре, добавить в список.

С моим кодом я получаю только звездочку:

import nltk
from nltk.tokenize import word_tokenize
import re


with open ('text-test.txt') as tx:
    text =word_tokenize(tx.read().lower())



with open ('Fr-dictionary.txt') as fr:
    dic = word_tokenize(fr.read().lower())


ast=re.compile(r'[\*]+')
regex=list(filter(ast.match,text))

valid_words=[]
invalid_words=[]

last = None
for w in text:
    if w in regex:
        last=w 
        a=last + w[+1]
        break
if a in dic:
    valid_words.append(a)
else:
    continue

Ответы [ 3 ]

3 голосов
/ 16 марта 2019

Вместо того, чтобы думать о «путешествии во времени» (т. Е. Переходить туда-сюда), Pythonic будет думать о функциональности (путешествия во времени имеют место в условиях с очень ограниченными ресурсами).

Один из способов - пройти путь перечисления, как показал @Yosufsn. Другой - zip список с самим собой, но с дополнением с обеих сторон. Как это:

words = ['les','engage', '*', 'ment', 'de','la'] 
for a,b,c in zip([None]*2+words, [None]+words+[None], words+[None]*2):
    if b == '*':
        print( a+c )
1 голос
/ 16 марта 2019

Я думаю, вам нужен простой код, подобный этому:

words = ['les','engage', '*', 'ment', 'de','la']

for n,word in enumerate (words):
    if word == "*":
        exp = words[n-1] + words[n+1]
        print (exp)

Вывод:

"engagement"

С этим выводом вы можете впоследствии проверить свой словарь.

0 голосов
/ 16 марта 2019

Я задавался вопросом, как управлять списком (ерунда), как это:

words = ['Bien', '*', 'venue', 'pour', 'les','engage', '*', 'ment', 'trop', 'de', 'YIELD', 'peut','être','contre', '*', 'productif' ]

Итак, я пришел с таким методом:

def join_asterisk(ary):
  i, size = 0, len(ary)
  while i < size-2:
    if ary[i+1] == '*':
      yield ary[i] + ary[i+2]
      i+=2
    else: yield ary[i]
    i += 1
  if i < size:
    yield ary[i]

, который возвращает:

print(list(join_asterisk(words)))
#=> ['Bienvenue', 'pour', 'les', 'engagement', 'trop', 'de', 'YIELD', 'peut', 'être', 'contreproductif']
...