3つのグループに正しく分割する最もPython的な方法は何ですか? この回答を見たことがあります https://stackoverflow.com/a/2801117/1461607しかし、右揃えにする必要があります。できれば、インポートのないシンプルで効率的なワンライナーです。
- '123456789' = ['123','456','789']
- '12345678' = ['12','345','678']
- '1234567' = ['1','234','567']
3つのグループに正しく分割する最もPython的な方法は何ですか? この回答を見たことがあります https://stackoverflow.com/a/2801117/1461607しかし、右揃えにする必要があります。できれば、インポートのないシンプルで効率的なワンライナーです。
別の方法は、効率についてはわかりませんが(文字列ではなく数値である方がよいでしょう)、2.7+でそれを行う別の方法です。
for i in map(int, ['123456789', '12345678', '1234567']):
print i, '->', format(i, ',').split(',')
#123456789 -> ['123', '456', '789']
#12345678 -> ['12', '345', '678']
#1234567 -> ['1', '234', '567']
シンプル(リンクの回答から繰り返し):
[int(a[::-1][i:i+3][::-1]) for i in range(0, len(a), 3)][::-1]
解説 :a[::-1]
の逆リストですa
。 スライスで反転を構成していきます。
a = a[::-1]
'123456789' - > '987654321'
a[i] = a[i:i+3]
'987654321' -> '987','654','321'
a[i] = int(a[i][::-1])
'987','654','321' -> 789, 654, 123
a = a[::-1]
789, 456, 123 -> 123, 456, 789
関数に適切な名前を付けると、デバッグが容易になります
invert = lambda a: a[::-1]
slice = lambda array, step : [ int( invert( array[i:i+step]) ) for i in range(len(array),step) ]
answer = lambda x: invert ( slice ( invert (x) , 3 ) )
answer('123456789')
#>> [123,456,789]
これは私が思いついた最高のものです:
[a[max(i-3,0):i] for i in range(len(a), 0, -3)][::-1]
もう 1 つは、リストを反転せずに機能しますが、少し醜いです。
[a[max(0,i):i+3] for i in range((len(a)-1)%3-2, len(a), 3)]
最短が常に最も Pythonic であるとは限りません。
def by3(s):
out = []
while len(s):
out.insert(0, s[-3:])
s = s[:-3]
return out
>>> by3(a)
['12', '345', '678']