如何在python中将字符串向右移?

Zee*_*ran 8 python

我尝试将一个字符串向右移动

  • 最后一个值应该是第一个,其余值如下
  • s= "I Me You" 应该回来 "You I Me"

我尝试了以下代码,但它不起作用请帮助我..

sr= "I Me You"
def shift_right(sr):
    L=sr.split()
    new_list=L[-1]

    new_list= new_list.append(1,L[:0])
    return (new_list)

print(shift_right(sr)
print (shift_reverse(sr))
Run Code Online (Sandbox Code Playgroud)

Jun*_*sor 6

首先我们拆分字符串:

>>> s = "I Me You"
>>> l = s.split()
>>> l
['I', 'Me', 'You']
Run Code Online (Sandbox Code Playgroud)

然后我们添加l[-1:],这是从最后一个元素到结尾l[:-1]的列表,它是从开始到(但不包含)最后一个元素的列表:

>>> l[-1:] + l[:-1]
['You', 'I', 'Me']
Run Code Online (Sandbox Code Playgroud)

最后我们加入:

>>> ' '.join(l[-1:] + l[:-1])
'You I Me'
Run Code Online (Sandbox Code Playgroud)


Mic*_*ico 6

现在 ...

比赛时间

也许更有趣的是什么是更快的方法?

第一次测试通过OP测试字符串(仅3个块),第二次测试通过600个char字符串的字符串。

from collections import deque
import timeit

def trivial(s):
    l = s.split()
    return ' '.join(l[-1:] + l[:-1])

def more_split(s):
    return ' '.join([s.split()[-1]] + s.split()[:-1])

def dq(s):
    s_deq = deque(s.split())
    s_deq.rotate(1)
    return ' '.join(s_deq)

def find_and_slice(s):
    lsi = s.rfind(' ')
    return s[lsi+1:] + ' ' + s[:lsi]

def rs_lazy(s):
    return ' '.join(reversed(s.rsplit(maxsplit=1)))

def rs_smart(s):
    rs = s.rsplit(maxsplit=1)
    return rs[1] + ' ' + rs[0]

def rpart(s):
    part = s.rpartition(' ')
    return part[-1] + part[1] + part[0]

def time_a_method(m, s):
    c_arg = "('{}')".format(s)
    t = timeit.timeit(m + c_arg, setup="from __main__ import " + m , number=100000)
    print( m + " "*(15-len(m)) + "----> {}".format(t))


if __name__ == '__main__':
    print(trivial("I Me You"))
    print(more_split("I Me You"))
    print(dq("I Me You"))
    print(find_and_slice("I Me You"))
    print(rs_lazy("I Me You"))
    print(rs_smart("I Me You"))
    print(rpart("I Me You"))
    print("######## USE: 'I Me You'")
    for m in ["trivial", "more_split", "dq", "find_and_slice", "rs_lazy", "rs_smart", "rpart"]:
        time_a_method(m, "I Me You")

    print("######## USE: 'a b c d e f '*100")
    s = 'a b c d e f '*100
    for m in ["trivial", "more_split", "dq", "find_and_slice", "rs_lazy", "rs_smart", "rpart"]:
        time_a_method(m, s)
Run Code Online (Sandbox Code Playgroud)

得到以下结果:

You I Me
You I Me
You I Me
You I Me
You I Me
You I Me
You I Me
######## USE: 'I Me You'
trivial        ----> 0.1339518820000194
more_split     ----> 0.1532761280000159
dq             ----> 0.182199565000019
find_and_slice ----> 0.07563322400005745
rs_lazy        ----> 0.23457759100006115
rs_smart       ----> 0.1615759960000105
rpart          ----> 0.06102836100001241
######## USE: 'a b c d e f '*100
trivial        ----> 3.2239098259999537
more_split     ----> 4.6946649449999995
dq             ----> 3.991058845999987
find_and_slice ----> 0.15106809200005955
rs_lazy        ----> 0.32278001499992115
rs_smart       ----> 0.22939544400003342
rpart          ----> 0.10590313199998036
Run Code Online (Sandbox Code Playgroud)

胜利者是.....

def rpart(s):
    part = s.rpartition(' ')
    return part[-1] + part[1] + part[0]
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶(我敢打赌,find_and_slice输了)。有2个答案类别:

  1. 蛮力:分割所有字符串
  2. 注意我们只需要字符串的最后一部分

即使在最简单的情况下I Me You,第一种方法也比最佳方法慢2到3倍。显然,当字符串变得更有趣时,第一种方法实际上效率很低。

真正有趣的是,投票最多的答案是速度较慢的:)


Vla*_*mir 1

这段代码对你有用

def shift_str(s):
    arr = s.split()
    first = arr.pop(0)
    arr.append(first)
    return " ".join(arr)
Run Code Online (Sandbox Code Playgroud)

例如:

shift_str("xxx ccc lklklk")>>'ccc lklklk xxx'