6

3つのグループに正しく分割する最もPython的な方法は何ですか? この回答を見たことがあります https://stackoverflow.com/a/2801117/1461607しかし、右揃えにする必要があります。できれば、インポートのないシンプルで効率的なワンライナーです。

  • '123456789' = ['123','456','789']
  • '12345678' = ['12','345','678']
  • '1234567' = ['1','234','567']
4

7 に答える 7

13

別の方法は、効率についてはわかりませんが(文字列ではなく数値である方がよいでしょう)、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']
于 2013-08-08T09:12:00.440 に答える
6

シンプル(リンクの回答から繰り返し):

[int(a[::-1][i:i+3][::-1]) for i in range(0, len(a), 3)][::-1]

解説 :a[::-1]の逆リストですa 。 スライスで反転を構成していきます。

ステップ1:リストを逆にする

 a           =   a[::-1]
'123456789' - > '987654321'

ステップ 2 : スリーの部分にスライス

 a[i]           =   a[i:i+3]
 '987654321'    ->  '987','654','321'

ステップ 3 : リストを再度反転して、数字を昇順で表示します

 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]
于 2013-08-08T08:39:07.517 に答える
5

これは私が思いついた最高のものです:

[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)]
于 2013-08-08T08:48:36.483 に答える
1

最短が常に最も Pythonic であるとは限りません。

def by3(s):
    out = []
    while len(s):
        out.insert(0, s[-3:])
        s = s[:-3]
    return out
>>> by3(a)
['12', '345', '678'] 
于 2013-08-08T08:51:57.193 に答える