文字列から最小値と最大値

How to get the minimum and maximum values ​in a string? – StackOverflow

files = ['foo.0001.jpg', 'test2.0003.jpg', 'foo.0004.jpg', 'tmp.txt',
         'foo.0003.jpg', 'test2.0002.jpg', 'test2.0004.jpg', 'test.0002.jpg',
         'foo.0002.jpg', 'foo.0005.jpg', 'test.0001.jpg']

print(['.'.join(max(e, key=lambda x: x[1])) for e in [[x for x in sorted([s.split('.') for s in files]) if x[0]==k] for k in set(s.split('.')[0] for s in files)]])
print(['.'.join(min(e, key=lambda x: x[1])) for e in [[x for x in sorted([s.split('.') for s in files]) if x[0]==k] for k in set(s.split('.')[0] for s in files)]])

[‘test2.0004.jpg’, ‘foo.0005.jpg’, ‘tmp.txt’, ‘test.0002.jpg’]
[‘test2.0002.jpg’, ‘foo.0001.jpg’, ‘tmp.txt’, ‘test.0001.jpg’]

%%timeit
['.'.join(max(e, key=lambda x: x[1])) for e in [[x for x in sorted([s.split('.') for s in files]) if x[0]==k] for k in set(s.split('.')[0] for s in files)]]
['.'.join(min(e, key=lambda x: x[1])) for e in [[x for x in sorted([s.split('.') for s in files]) if x[0]==k] for k in set(s.split('.')[0] for s in files)]]

142 µs ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

li = sorted(files)
k = set(x.split('.')[0] for x in files)
for x in k:
    print(f'{x}: (', end='')
    print(min(e for e in li if x+'.' in e), end=', ')
    print(max(e for e in li if x+'.' in e), end='')
    print(')')

test2: (test2.0002.jpg, test2.0004.jpg)
foo: (foo.0001.jpg, foo.0005.jpg)
tmp: (tmp.txt, tmp.txt)
test: (test.0001.jpg, test.0002.jpg)

li = sorted(files)
k = set(x.split('.')[0] for x in files)
for x in sorted(k):
    print(f'{x}: (', end='')
    print(min(e for e in li if x+'.' in e), end=', ')
    print(max(e for e in li if x+'.' in e), end='')
    print(')')

foo: (foo.0001.jpg, foo.0005.jpg)
test: (test.0001.jpg, test.0002.jpg)
test2: (test2.0002.jpg, test2.0004.jpg)
tmp: (tmp.txt, tmp.txt)

%%timeit
li = sorted(files)
k = set(x.split('.')[0] for x in files)
for x in k:
    min(e for e in li if x+'.' in e), max(e for e in li if x+'.' in e)

42.1 µs ± 867 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
li = sorted(files)
k = set(x.split('.')[0] for x in files)
for x in sorted(k):
    min(e for e in li if x+'.' in e), max(e for e in li if x+'.' in e)

43.3 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

k = set(x.split('.')[0] for x in files)
ik = iter(sorted(k))
res = []
x = next(ik)
for e in sorted(files):
    if x+'.' in e:
        res.append(e)
    else:
        print(f'{x}: (', end='')
        print(min(res), end=', ')
        print(max(res), end='')
        print(')')
        res = []
        res.append(e)
        x = next(ik)
        continue

foo: (foo.0001.jpg, foo.0005.jpg)
test: (test.0001.jpg, test.0002.jpg)
test2: (test2.0002.jpg, test2.0004.jpg)

%%timeit
k = set(x.split('.')[0] for x in files)
ik = iter(sorted(k))
res = []
x = next(ik)
for e in sorted(files):
    if x+'.' in e:
        res.append(e)
    else:
        min(res), max(res)
        res = []
        res.append(e)
        x = next(ik)
        continue

22.4 µs ± 1.48 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

コードは少し汚いけど,無駄なループを省いた方が速い.
(内包表記よりforループの方がループが1つ少ないし,ジェネレータを使えば関係ない部分のループを減らせるので,ループの長さが半分くらいになる)

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中