Как посчитать среднее количество мест между буквой в строке? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть такие строки:

F-F-F+F+F+F-F-F-F+F+F+F-F+F+F-F+F-F-F-F

И я хотел бы посчитать среднее количество мест между экземплярами 'F', '+' и '-'.
Так что для этого примера это будет:

Average chars between Fs:   1
Average chars between +s:   2.25
Average chars between -s:   3

Какой самый эффективный способ сделать это?

Ответы [ 3 ]

4 голосов
/ 22 мая 2019

это вариант.

сначала я собираю индекс i вхождений всех char актеров; Затем я вычисляю mean различий:

from collections import defaultdict
from itertools import islice
from statistics import mean

strg = "F-F-F+F+F+F-F-F-F+F+F+F-F+F+F-F+F-F-F-F"

dct = defaultdict(list)

for i, char in enumerate(strg):
    dct[char].append(i)

for char, occurrences in dct.items():
    avg = mean(b - a for a, b in zip(occurrences, islice(occurrences, 1, None))) - 1
    print(f"Average chars between {char}s:  {avg}")

это печатает:

Average chars between Fs:  1
Average chars between -s:  3
Average chars between +s:  2.25

после первого цикла for будут такие записи в dct:

'-': [1, 3, 11, 13, 15, 23, 29, 33, 35, 37]

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

1 голос
/ 22 мая 2019

Я бы сделал это, используя регулярные выражения (re модуль), следующим образом:

import re
txt = "F-F-F+F+F+F-F-F-F+F+F+F-F+F+F-F+F-F-F-F"
chars = set(list(txt))
between = dict()
for i in chars:
    between[i] = re.findall('(?<='+re.escape(i)+').*?(?='+re.escape(i)+')',txt)
for i in chars:
    if len(between[i])==0:
        between[i] = 0.0
    else:
        between[i] = sum([len(i) for i in between[i]])/len(between[i])
print(between)

Вывод:

{'F': 1.0, '+': 2.25, '-': 3.0}

Объяснение: Я ищу подстроки между вхождениями данного символа(используя утверждения нулевой длины) слева направо, не жадным образом (следовательно, "F-F-F" дает ["-","-"] вместо ["-F-"]), а затем просто вычисляет средние значения их длин.Обратите внимание, что я использовал re.escape для работы с символами особого значения (например, +).

0 голосов
/ 22 мая 2019

Другой способ без использования каких-либо библиотек:

string = 'F-F-F+F+F+F-F-F-F+F+F+F-F+F+F-F+F-F-F-F'
string = list(string)
chars = set(string)
for char in chars:
    ind = [i for i, x in enumerate(string) if x == char]
    diff = [ind[i+1]-ind[i] - 1 for i in range(len(ind)-1)]
    print(f'Average chars between {char}s:  {sum(diff) / len(diff)}')

Вывод:

Average chars between +s:  2.25
Average chars between Fs:  1.0
Average chars between -s:  3.0
...