【问题标题】:Reverse characters of string in subset of 33个子集中的字符串反转字符
【发布时间】:2017-01-21 23:24:50
【问题描述】:

假设我的字符串是:

x = 'abcdefghi'

我想在 3 的子集中反转它,所以我的输出是:

x = 'cbafedihg'

即第 0 个索引与第 2 个索引交换,第 3 个索引与第 5 个交换,依此类推。

下面是我基于将string 转换为list 并交换列表中的元素的代码:

string_list = list(x)
for i in range(len(string_list)/3):
    string_list[i*3], string_list[i*3+2] = string_list[i*3+2], string_list[i*3]

''.join(string_list)
# Output: 'cbafedihg'

我想知道实现它的最有效和最 Pythonic 的方法是什么。

注意:len(x)%3 将始终为 0。

【问题讨论】:

  • 添加了我认为可以作为答案的替代方法。我仍然很想知道是否有更有效的方法来实现它。

标签: python string python-2.7 python-3.x slice


【解决方案1】:

上面的代码可以用string slicinglist comprehension写成:

# Here x[i*3:i*3+3][::-1] will reverse the substring of 3 chars
>>> ''.join([x[i*3:i*3+3][::-1] for i in range(len(x)/3)])
'cbafedihg'

根据Delgan 的评论,可以将step 用作3 并将range 本身用作:

>>> ''.join(x[i:i+3][::-1] for i in range(0, len(x), 3))
'cbafedihg'

【讨论】:

  • 其他选择:''.join(x[i:i+3][::-1] for i in range(0, len(x), 3)) 这展示了使用生成器理解而不是列表理解的优势,这对我来说似乎更具可读性(更少的索引乘法)并且这与 Python 3 兼容,因为没有浮动除法完成。
  • @Delgan:是的,这也是一个不错的解决方案。我错过了那个。与我在这里提到的第一个解决方案相比,它绝对干净得多。
  • @Delgan:我应该将其添加为我的答案的编辑,还是将其添加为答案?因为,我认为这对以后访问 SO 的其他用户会有帮助
  • 我的替代解决方案不值得自己回应,更新您的答案似乎是一个很好的解决方案。 :)
  • 已更新。我相信您应该为此获得荣誉,因此与它分享了您的个人资料链接。希望你不会介意:)
【解决方案2】:

实现此目的的另一种方法是将您的字符串类型转换为 list,然后使用 list slicing 简单地交换 list 的元素,步骤为 3,然后重新加入字符串为:

>>> string_list = list(x)
>>> string_list[::3], string_list[2::3] = string_list[2::3], string_list[::3]
>>> ''.join(string_list)
'cbafedihg'

【讨论】:

    【解决方案3】:

    编写一个更具可读性和灵活性的函数?

    def get_string(input_str, step=3):
        output = ""
        i = 0
        for _ in list(input_str):
            if i == len(input_str):
                return output
            elif i+step-1 >= len(input_str):
                output += input[len(input_str)-1:i-1:-1]
                return output
            else:
                output += input_str[i+step-1:i:-1] + input_str[i]
                i += step
        return output
    

    这里是灵活的部分:

    get_string("abcdefghi")
    # Ouputs 'cbafedihg'
    get_string("abcdefghi", 2)
    # Outputs 'badcfehgi'
    get_string("abcdefghi", 5)
    # Outputs 'edcbaihgf'
    

    不说了,如果你想增加一些逻辑或者改变逻辑,这里更容易改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2023-02-01
      • 2020-07-27
      • 2016-01-06
      • 2022-11-08
      • 1970-01-01
      • 2012-04-03
      • 2021-02-13
      相关资源
      最近更新 更多