【问题标题】:How to move element around element in a string如何在字符串中的元素周围移动元素
【发布时间】:2020-08-22 09:33:07
【问题描述】:

我想要一个函数,将 str_a 中的最后一个元素围绕字符串移动到末尾。 (在这种情况下:'adbefc')然后 str_1 中的倒数第二个元素移动一个,然后最后一个元素再次移动到末尾。我想移动 所有 str_a 中除第一个元素之外的元素。

def arrange(str_a, str_b): #You don't need to use this variable
  #TODO

>>> arrange('abc', 'def') #Example 1
['abcdef', 'abdcef', 'abdecf', 'abdefc', 'adbcef', 'adbecf', 'adbefc', 'adebcf', 'adebfc', 'adefbc']

>>> arrange('OXY', 'OOO') #Example 1a (Better insight)
['OXYOOO', 'OXOYOO', 'OXOOYO', 'OXOOOY', 'OOXYOO', 'OOXOYO', 'OOXOOY', 'OOOXYO', 'OOOXOY', 'OOOOXY'] 

>>> arrange('ab', 'cd') #Example 2
['abcd', 'acbd', 'acdb']

这就是我所做的,它只适用于 2 个字符的字符串。希望这能让我对我想要完成的工作有所了解

def arrange(str_a, str_b, idx = 0, lst = []):
  idx += 1
  length = len(str_a + str_b)
  if idx == length - 1:
    return lst
  str_full = str_a + str_b
  list_full = list(str_full)
  elem = list_full[idx]
  list_full[idx] = list_full[idx + 1]
  list_full[idx + 1] = elem
  lst.append(''.join(list_full))
  middle_index = int(length/2)
  str_a = ''.join(list_full[:middle_index])
  str_b = ''.join(list_full[middle_index:])
  return arrange(str_a, str_b, original, idx, rev,lst)


if __name__ == '__main__':
  result = arrange('ab', 'cd')
  print(result)```

【问题讨论】:

  • 你能展示一下你到目前为止所做的尝试吗?
  • 我尝试的是我做了一个可选参数 output = [] 并尝试使用 for 循环和递归来解决这个问题。它只适用于安排('ab','cd')。
  • 呃,这不是作业吗??
  • 我有一个正在运行的程序,但我尝试了另一种方法。如果这有帮助。它给了我一个带有大字符串的 MemoryError 并且效率不高。
  • 元素的“顺序”重要吗?

标签: python arrays string list


【解决方案1】:

itertools.combinations 是你的朋友。

import itertools

def arrange_helper(str1, str2):
  m, n = len(str1), len(str2)
  for indices in itertools.combinations(range(1, m+n), m-1):
    characters = [None] * (m+n)
    characters[0] = str1[0]
    for index, character in zip(indices, str1[1:]):
      characters[index] = character
    it = iter(str2)
    for index, character in enumerate(characters):
      if character is None:
        characters[index] = next(it)
    yield ''.join(characters)

def arrange(str1, str2):
  return list(arrange_helper(str1, str2))

例子:

>>> arrange('123', '456')
['123456', '124356', '124536', '124563', '142356', '142536', '142563', '145236', '145263', '145623']

>>> arrange('OXY', 'OOO')
['OXYOOO', 'OXOYOO', 'OXOOYO', 'OXOOOY', 'OOXYOO', 'OOXOYO', 'OOXOOY', 'OOOXYO', 'OOOXOY', 'OOOOXY']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2012-02-11
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2016-08-08
    • 2021-11-30
    相关资源
    最近更新 更多