2017-06-20 12 views
0

文字列を正しくフォーマットするために、別の長さの塊に分割する必要がありました。例として、これは文字列です文字列を異なる長さに分割します。

- 25c319f75e3fbed5a9f0497750ea12992b30d565、固定長のチャンクでそれを分割するために、私は単に手順やスライスを使用します。

s = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
n = 2 
print("-".join([s[i:i+n] for i in range(0, len(s), n)])) 

しかし、nは番号のリストだった場合、私は何ができます一例として、分割する:

print("-".join([s[0:8], s[8:12], s[12:16], s[16:20], s[20:24], s[24:32]])) 
:私が作った

s = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
n = [8, 4, 4, 4, 4, 12] # edited for consistency - Coldspeed 

唯一の解決策は、このました

pythonicではなく、より信頼性の高い文字列ではありません。

コードの最後の例からの出力:

25c319f7-5e3f-bed5-a9f0-4977-50ea1299 

だから、これはより多くの神託1つのライナーの方法で行うことができますか?これが行われるための他のより自動化された方法は何ですか?

答えて

1
>>> s = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
>>> n = [8, 4, 4, 4, 4, 12] 
>>> print '-'.join([s[sum(n[:i]) : sum(n[:i+1])] for i in range(len(n)) ]) 

出力

25c319f7-5e3f-bed5-a9f0-4977-50ea12992b30 
+1

答えをありがとう。出力は '--- 19f75e3f' – ShellRox

+0

です。出力は' --19f7-5e3'です。 – ShellRox

+0

@ShellRoxもう少し遅いですが、ここにはitertoolsのない1つのライナーがあります。合計を呼び出し続けるので、非効率ですので注意してください。しかし、それは動作します。 –

4

増分itertools.isliceを使用して文字列とスライスからイテレータを作成する:

from itertools import islice 

s = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
it = iter(s) 
n = [8, 4, 4, 12] 

s = '-'.join(''.join(islice(it, None, x)) for x in n) 
print(s) 
# 25c319f7-5e3f-bed5-a9f0497750ea 

注スライス(S)の合計サイズがの長さと等しくない場合は、文字列の末尾の一部が失われること文字列;イテレータは完全に使い果たされていません。(必要な場合)

あなたは、最終的な前処理段階で後続の部分を追加することができる:

s += '-' + ''.join(it) 
print(s) 
# 25c319f7-5e3f-bed5-a9f0497750ea-12992b30d565 

をここで開始インデックスを増加させることによって増分列をスライス、forループを使用する別のアプローチです

start = 0 
d = [] 
for i in n: 
    d.append(s[start:start+i]) 
    start += i 
d.append(s[start:]) 
print('-'.join(d)) 
# 25c319f7-5e3f-bed5-a9f0497750ea-12992b30d565 
+0

答えていただきありがとうございます、それはitertoolsの助けなしにはできません正しいですか? – ShellRox

+0

@ShellRox itertoolsを使いたくない理由は何ですか? –

+0

Kolodoye私はちょうどモジュールの余分な使用を避けようとしていますが、代替方法がない場合は問題にはなりません。 – ShellRox

0

ない1-リニアは、私は怖いが、私の頭の上から:

s = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
n = [8, 4, 4, 4, 4, 12] 
res=[] 
for split in n: 
    temp=s[:split] 
    s=s[split:] 
    res.append(temp) 
print(res) 

出力はそれに応じて操作することができ、それぞれの文字列の配列である:

['25c319f7', '5e3f', 'bed5', 'a9f0', '4977', '50ea12992b30'] 
0

我々が記載されているデータから始める場合:

string = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
lengths = [8, 4, 4, 12] 

我々はトンを見つけるためにスキャンを使用することができます彼は始まりまたは各部分の両端:

import itertools 
ends = list(itertools.accumulate(lengths)) 

accumulateは、Python 3に固有のものですので、我々は、Python 2(この1の遅いO(n²)で)でスキャンを行うには回避策が必要になる場合があります表示されます。

starts = [sum(lengths[:i]) for i in range(len(lengths))] 

そして、我々は、部品を抽出するために組み合わせて使用​​することができます。

dashed = '-'.join(string[end-length : end] 
        for end,length in zip(ends,lengths)) 

すべてこの長さ/インデックス操作の利点はそれだけで、文字列のコピーを作成しないということであるその個々の部品。それ以外の場合、Seanの解決策は非常にきれいです。

+0

答えをいただきありがとうございます。間違いなく便利ですが、私は通常のPythonだけを使用するソリューションを探しています。 – ShellRox

+1

これは通常のPythonではどうですか?それはすべての標準ライブラリです。 –

+0

誤解をおかけして申し訳ありませんが、私は可能なので、この場合モジュールを使用しないようにしています。 – ShellRox

1
s = '25c319f75e3fbed5a9f0497750ea12992b30d565' 
n = [8, 4, 4, 12] 

def make_chunks(s,n): 
    result = [] 
    for length in n: 
     result.append(s[:length]) 
     s = s[length:] 
    if s: 
     result.append(s) 
    return '-'.join(result) 

print(make_chunks(s,n)) 
関連する問題