Список понимания и почтовый индекс
Это примерно в 10-70x раз быстрее, чем другие решения.
my_values = my_string.split()
output = [x for x,y in zip(my_values,my_values[1:])
if (y == '0.000000000000000000e+00' and x != '0.000000000000000000e+00')]
print(output)
Или с островком, чтобы сохранить память, как любезно предложено @ Жан-Франсуа Фабр:
import itertools
my_values = my_string.split()
output = [x for x,y in zip(my_values,itertools.islice(myvalues,1,None))
if (y == '0.000000000000000000e+00' and x != '0.000000000000000000e+00')]
print(output)
Это работает путем группировки элементов в пары (x, y). х должен отличаться от 0.00..
, а у должен быть равен ему. Выполнив сначала проверку y, вы в большинстве случаев получите быстрое значение False
и продолжите итерацию.
Возвращает:
['1.440101653069986610e+26', '8.079362883576220633e+25']
Панды и NumPy
Однако другой идеей (которую я бы счел здесь наиболее разумной) было бы использование панд и pd.to_numeric()
. Когда вы работаете с числами, вы, скорее всего, захотите использовать такую библиотеку, как numpy или pandas. Это будет безопаснее, так как вы также можете плавно обрабатывать ошибки Также обратите внимание, что я в обоих случаях преобразовываю числа обратно в строку (которую можно пропустить).
import pandas as pd
data = pd.Series(pd.to_numeric(my_string.split()))
output = data[(data != 0) & (data.shift(-1) == 0)].astype(str).tolist()
print(output)
#['1.440101653069986610e+26', '8.079362883576220633e+25']
И NumPy:
import numpy as np
data = np.loadtxt(my_string.split())
output = list(map(str,data[(data != 0) & (np.roll(ar, -1) == 0)]))
print(output)
#['1.440101653069986610e+26', '8.079362883576220633e+25']
Сравнение времени
самый быстрый -> самый медленный
100000 loops, best of 3: 9.28 µs per loop <-- Anton vBR list comprehension
10000 loops, best of 3: 98.4 µs per loop <-- Revos Regex
1000 loops, best of 3: 256 µs per loop <-- Anton vBR numpy
1000 loops, best of 3: 425 µs per loop <-- Tzot Regex
1000 loops, best of 3: 513 µs per loop <-- Jean-François Fabre Regex
1000 loops, best of 3: 782 µs per loop <-- liliscent
1000 loops, best of 3: 794 µs per loop <-- Anton vBR pandas