У меня есть такие строки:
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
Что было бы наиболее эффективным способом сделать это?
Должен признаться, я ничего не пробовал






это вариант.
сначала я собираю индекс 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 вычисляет среднее значение различий.
Я бы сделал это, используя регулярные выражения (модуль 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 для обозначения символов особого значения (например, +).
Может кто знающий ;) подтвердит?
Другой способ без использования каких-либо библиотек:
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
что ты уже испробовал? Нам будет легче предлагать улучшения, если мы увидим, что вы сделали для решения этой проблемы.