在python中更改字符串的顺序

时间:2017-10-15 14:48:47

标签: python

如何更改字符串序列? 对于例如

mys='4002-10-21'

预期结果:

'4002-21-10'

我尝试过:

我可以枚举分割的字符串,然后像1-3-2

那样重新排列序列
newlist=list()
for i, v in enumerate(mys.split('-')):
    newlist.append(v)

8 个答案:

答案 0 :(得分:9)

如果您真的想重新格式化日期时间字符串,我建议您将字符串解析为日期时间对象并根据需要对其进行格式化:

import datetime                                                                                   

def rearrange(*args):                                                                             
    return [datetime.datetime.strptime(arg, '%Y-%m-%d').strftime('%Y-%d-%m') for arg in args]
>>> rearrange('4002-10-21', '4002-10-28')
['4002-21-10', '4002-28-10']  

答案 1 :(得分:7)

使用operator.itemgetter,您只需拨打一个电话即可获得多个项目:

>>> from operator import itemgetter
>>> '-'.join(itemgetter(0,2,1)(mys.split('-')))
'4002-21-10'

使用string format ,您可以从参数中选择值:

>>> "{0}-{2}-{1}".format(*mys.split('-'))
'4002-21-10'

使用re.sub,您可以捕获组并重新排序(假设数字):

>>> import re
>>> re.sub(r'(\d+)-(\d+)-(\d+)', r'\1-\3-\2', mys)
'4002-21-10'

如果您在pandas中需要此内容(如评论中所示),您可以在DataFrame.replaceSeries.str.replace中使用基于正则表达式的方法,例如(添加inplace=True } for in-place subs):

>>> import pandas as pd
>>> df = pd.DataFrame({'dates': ['4002-10-21']})
>>> df.dates.replace(r'(\d+)-(\d+)-(\d+)', r'\1-\3-\2', regex=True)
0    4002-21-10
Name: dates, dtype: object

答案 2 :(得分:3)

鉴于问题的背景,你的方法很好:

mys = '4002-10-21'
parts = mys.split('-')
mys = parts[0] + '-' + parts[2] + '-' + parts[1]
print(mys)  # "4002-21-10"
它确实很脆弱,但如果是个人或一次性剧本,谁在乎呢?如果您需要更多的灵活性,那么您需要更明确地描述约束的性质。

答案 3 :(得分:3)

假设:

mys='4002-10-21'

你可以简单地为它编写一个函数,如:

def change_order(string, split_char, *args):
    string = string.split(split_char)

    new_list = []

    for i in args:
        try:
            new_list.append(string[i])  # change to i-1 for abstracted parameters
        except IndexError:
            return False

    return split_char.join(new_list)

'4002-10-21'一个1, 3, 2(实际代码需要1,因为它的零索引)重新排序给出了:

>>> test.change_order('4002-10-21', '-', 0, 2, 1)
'4002-21-10'

答案 4 :(得分:3)

一种好的方法是使用正则表达式,这样我猜想的数字可以有不同的长度,例如:'4002-21-1'也可以正常工作。

    import re

    mys = '4002-21-10'

    parts = re.findall('[\d]+', mys) # finds all numbers that are next to each other
    print(parts) # just so you see what is created

    formatted_mys = parts[0] + "-" + parts[2] + "-" + parts[1] # put the parts together in the way you wanted

如果您愿意,可以删除print行。还有很多其他方法可以做你想要的,但如果你需要灵活,这就是我的建议。

答案 5 :(得分:2)

您可以在-上拆分,然后重新加入-作为分隔符,但只需根据需要重新订购:

>>> s = '4002-10-21'
>>> d = s.split('-')
>>> new_s = "-".join((d[0], d[2], d[1]))
'4002-21-10'

或者,在没有join之后,您可以简单地执行以下操作:

new_s = "{}-{}-{}".format(d[0], d[2], d[1])

答案 6 :(得分:2)

你可以试试这个:

mys='4002-10-21'
m = mys.split("-")
new_mys = m[0]+"-"+'-'.join(m[1:][::-1])

输出:

'4002-21-10'

答案 7 :(得分:2)

L='4002-10-21'
L=L.split("-")
L[i:3] = L[2:0:-1]
"-".join(L)

你可以使用切片。