Самый быстрый способ извлечь и увеличить последнее число с конца строки - PullRequest
0 голосов
/ 13 июля 2020

У меня есть список строк, в которых есть числа в качестве суффиксов. Я пытаюсь извлечь наибольшее число, чтобы увеличить его на 1. Вот что я придумал, но мне интересно, есть ли более быстрый способ сделать это:

data = ["object_1", "object_2", "object_3", "object_blah", "object_123asdfd"]
numbers = [int(obj.split("_")[-1]) for obj in data if obj.split("_")[-1].isdigit()] or [0]
print sorted(numbers)[-1] + 1 # Output is 4

Несколько условий:

  • Вполне возможно, что суффикс вовсе не является числом, и его следует пропустить.
  • Если ввод недопустим, то на выходе должно быть 1 (поэтому я иметь or [0])
  • Нет Python 3 решения, только 2.7.

Может быть, некоторые маги регулярных выражений c быстрее найдут наибольшее число для увеличения? Мне не нравится тот факт, что мне приходится делиться дважды.

Изменить

Я провел несколько тестов для текущих ответов, используя 100 итераций данных, содержащих 10000 элементов :

  • Метод Алекса Нонейма: 1,65 с
  • Метод Сушанта: 1,95 с
  • Баладжи Амбре sh Метод: 2,12 с
  • Мой оригинал метод: 2.16s

Я принял ответ, но не стесняйтесь вносить свой вклад.

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Использование heapq.nlargest - довольно эффективный способ. Может кто сравнит с другими методами.

import heapq

a = heapq.nlargest(1, map(int, filter(lambda b: b.isdigit(), (c.split('_')[-1] for c in data))))[0]

Сравнение с оригинальным методом (Python 3.8)

import heapq
import random
from time import time

data = []

for i in range(0, 1000000):
    data.append(f'object_{random.randrange(10000000)}')

begin = time()
a = heapq.nlargest(1, map(int, filter(lambda b: b.isdigit(), (c.split('_')[-1] for c in data))))[0]
print('nlargest method: ', time() - begin)
print(a)

begin = time()
numbers = [int(obj.split("_")[-1]) for obj in data if obj.split("_")[-1].isdigit()] or [0]
a = sorted(numbers)[-1]
print('original method: ', time() - begin)
print(a)
nlargest method:  0.4306185245513916
9999995
original method:  0.8409149646759033
9999995

2 голосов
/ 13 июля 2020

попробуйте это, используя list comprehension, чтобы получить все цифры, и max вернет самое высокое значение.

max([
    int(x.split("_")[-1]) if x.split("_")[-1].isdigit() else 0 for x in data
]) + 1
1 голос
/ 13 июля 2020

Попробуйте:

import re
res = max([int( (re.findall('_(\d+)$', item) or [0])[0] ) for item in data]) + 1

Значение:

4
...