Получение следующей переменной в цикле for

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

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

У меня есть общее представление о том, как я могу это сделать, но я застрял в синтаксисе, чтобы заставить его работать.

 for bigram in inputList: bigramDict[str(bigram + bigram+1)] = 1 

Где bigram + 1 – это буква на следующей итерации

В качестве примера, если бы я должен был иметь текст «stackoverflow» в inputList мне нужно сначала поместить буквы «st» в качестве ключа и 1 в качестве значения. На второй итерации «ta» в качестве ключа и так далее. Проблема, с которой я сталкиваюсь, – это вернуть значение, которое переменная будет на следующей итерации, не переходя к следующей итерации.

Надеюсь, я ясно объяснил. Спасибо за вашу помощь

4 Solutions collect form web for “Получение следующей переменной в цикле for”

Прямым способом получения n-граммов для последовательности является нарезка:

 def ngrams(seq, n=2): return [seq[i:i+n] for i in range(len(seq) - n + 1)] 

Объедините это с collections.Counter и вы готовы:

 from collections import Counter print Counter(ngrams("abbabcbabbabr")) 

Если вам нужны ngrams() чтобы быть ленивым:

 from collections import deque def ngrams(it, n=2): it = iter(it) deq = deque(it, maxlen=n) yield tuple(deq) for p in it: deq.append(p) yield tuple(deq) 

(См. Ниже более элегантный код для последнего).

Используйте zip для zip-строки для копирования самого смещения на 1

Получите такие данные:

 s = "stackoverflow" zip(s,s[1:]) 

дает:

 [('s', 't'), ('t', 'a'), ('a', 'c'), ('c', 'k'), ('k', 'o'), ('o', 'v'), ('v', 'e'), ('e', 'r'), ('r', 'f'), ('f', 'l'), ('l', 'o'), ('o', 'w')] 

Триграфы также легки:

 zip(s,s[1:],s[2:]) 

дает:

 [('s', 't', 'a'), ('t', 'a', 'c'), ('a', 'c', 'k'), ('c', 'k', 'o'), ('k', 'o', 'v'), ('o', 'v', 'e'), ('v', 'e', 'r'), ('e', 'r', 'f'), ('r', 'f', 'l'), ('f', 'l', 'o'), ('l', 'o', 'w')] 

Вы можете использовать кортежи как ключи для своего словаря … или лучше использовать объекты Counter или default_dict для выполнения подсчетов. Удачи!

 from collections import Counter from itertools import islice, izip, tee def pairs(iterable): a, b = tee(iterable) for pair in izip(a, islice(b, 1, None)): yield pair print Counter(pairs("stackoverflow")) 

Или более простая версия:

 def pairs(iterable): it = iter(iterable) last = next(it) for c in it: yield last, c last = c 

Обобщенная версия для произвольного n :

 def ngrams(iterable, n=2): return izip(*[islice(it, i, None) for i, it in enumerate(tee(iterable, n))]) 

Сохранять переменную предыдущей буквы? Первая итерация вы просто получаете первое письмо и больше ничего не делаете.

ДОБАВЛЕНИЕ: Этот метод, по крайней мере, не должен тратить больше памяти, чем простая переменная для хранения одной буквы, без лишних кортежей или чего-то еще.

  • «Pythonic» для цикла над целыми числами от 0 до k-1, за исключением i
  • Итерация в двух разных словарях одновременно на Python
  • Каков наиболее эффективный способ прокрутки данных с помощью панд?
  • Использование для ... else в генераторах Python
  • Как я могу связать forloop.counter с строкой в ​​моем шаблоне django?
  • Китон: для i от 1 <= i <N
  • Как Python выполняет итерацию цикла for?
  • Более быстрый способ суммировать список чисел, чем с циклом for-loop?
  • Python - лучший язык программирования в мире.