6

正确分成三组的最Pythonic方式是什么?我已经看到了这个答案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 我们将用切片组成反转的反向列表。

第一步:反转列表

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

这是我想出的最好的:

[a[max(i-3,0):i] for i in range(len(a), 0, -3)][::-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 回答
1

四个班轮:

splitted_number = []
while number:
    number, r = number[:-3], number[-3:]
    splitted_number.insert(0, r)
于 2013-08-08T09:10:07.097 回答
1

如果有人觉得这很有用,我的 2cents:textwrap是做这件事的内置模块。

from textwrap import wrap

a = '123456789'
b = wrap(a, 3)
>>> b ['123', '456', '789']
于 2019-01-22T11:26:15.680 回答
0

扩展@Manu 答案,

from textwrap import wrap

a = '123456789'
b = wrap(a, 3)
print(b)

newlist = []

for i in b:
    newlist.append(int(i))
   
print(newlist)
['123', '456', '789']
[123, 456, 789]

[Program finished] 

或者

n = 1234567890
v = [] 
while n > 0:
    n, r = divmod(n, 1000) 
    v.insert(0, r)

print(v)
[1, 234, 567, 890]

[Program finished]
于 2021-03-07T02:46:10.720 回答