2013-05-26 26 views
2

我有一个特定的字符串或几个字符串。 例如:获取写在后面的字符串的后半部分

a = '12345678' 
b = '123456789' 

我正在使用Python 3.2。我试图让后面写一个字符串的后半部分。如果一个字符串有奇数个字符,则丢弃中间的字符。所以,我想要实现的是:

a_out = '8765' 
b_out = '9876' 

我做的方式,它是:

a_back = a[::-1] 
a_out = a_back[0:len(a_back)//2] 

的问题是:是否有一个较短的方式做到这一点?它可以在一个操作而不是两个操作中完成吗?

回答

6

可以计算出指数,同时扭转字符串:

>>> a[:-(len(a)+1)//2:-1] 
'8765' 
>>> b[:-(len(b)+1)//2:-1] 
'9876' 
1

你可以只让一个班轮:

a_out = a[::-1][0:len(a)//2] 

这将是很好,如果你可以在一个字符串做花哨的索引,就像我们在一个numpy阵列做,那么另一种解决方案是:

a_out = a[ range(len(a)-1, len(a)//2-1, -1) ] # NOT POSSIBLE 

@jamylak建议使用 'itemgetter' 完成花式索引同等一种有效的方式:

from operator import itemgetter 
items = [0,3,2,1,0,0,2,3,] 
a_out = ''.join(itemgetter(*items)(a)) 
#14321134 
+1

的'numpy'解决这个问题可以准确方法一样可以解决由@NolenRoyalty提供的解决方案 – jamylak

+0

谢谢你,对我而言,学习索引可以用这种方式计算是一件好事。但是花式索引也接受类似于[0,3,2,1,5]的东西,并不一定在范围内。 –

+1

然而,这会变慢,并且你可以在Pure python中用' from operator import itemgetter'' itemgetter(* list_of_indices)(a)' – jamylak

1

使用方法:

a = '12345678' 
b = '123456789' 

def method(x): 
    return x[:-(len(x)+1)//2:-1] 

print method(a) 
print method(b) 

>>> 
8765 
9876 
+2

'len(x)// 2',因为OP使用的是Python 3。 – Blender

相关问题