【问题标题】:python consecutive elements to swap the list items [duplicate]python连续元素交换列表项[重复]
【发布时间】:2020-01-25 23:53:29
【问题描述】:

我的输入如下:

 ['a','b','c','d','e','f'] 

输出:

 ['b','a','d','c','f','e']

我试图获取连续列表,但我在空字符串之间获取列表,所以请删除那些空列表。

s = list(input().split())

def swap(c, i, j):
    c[i], c[j] = c[j], c[i]
    return ' '.join(c)

result = swap(s, 0, 1)
print(list(result))

当前输出:-['b', ' ', 'a', ' ', 'c', ' ', 'd', ' ', 'e', ' ', 'f']

预期输出:-['b', 'a', 'c', 'd', 'e','f']

【问题讨论】:

  • 您可能不想将输入列表变成字符串?您稍后将其转换回列表。你可以从你的交换函数中返回 c。
  • 下次当你问任何问题时,这里只有一个预期输出是两个输出 ['b','a','d','c','f','e'] 和['b', 'a', 'c', 'd', 'e','f'] 所以对于你想要的代码,你可以检查我的答案,我给出了两个解决方案。

标签: python


【解决方案1】:

你只需将c作为list返回即可,不需要再转成字符串再转回列表:

s = ['a','b','c','d','e','f']

def swap(c, i, j):
  c[i], c[j] = c[j], c[i]
  return c

result = swap(s, 0, 1)
print(result)

输出:

['b', 'a', 'c', 'd', 'e', 'f']

【讨论】:

    【解决方案2】:

    一个简单的交换对的函数,不改变输入

    def swap_pairs(list_to_swap):
        s = list_to_swap[:] # create copy to not touch the original sequence
        for i in range(0, len(s)-1, 2):
            s[i], s[i+1] = s[i+1], s[i]
        return s
    
    s0 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    s1 = ['a', 'b', 'c', 'd', 'e', 'f']
    print(swap_pairs(s0))
    print(swap_pairs(s1))
    # ['b', 'a', 'd', 'c', 'f', 'e', 'g']
    # ['b', 'a', 'd', 'c', 'f', 'e']
    
    ### check if s0 and s1 are untouched:
    print(s0)
    print(s1)
    # ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    # ['a', 'b', 'c', 'd', 'e', 'f']
    

    如果您想“就地”交换对,即直接更改输入,您可以将过程缩短为

    def swap_pairs(s):
        for i in range(0, len(s)-1, 2):
            s[i], s[i+1] = s[i+1], s[i]
        # return s
    s1 = ['a', 'b', 'c', 'd', 'e', 'f']
    swap_pairs(s1)
    print(s1)
    # ['b', 'a', 'd', 'c', 'f', 'e']
    

    我认为是否应该在此处添加 return 语句是一个品味问题。我认为返回某些东西会更清楚 not 因为逻辑上不需要。无论如何,请注意变量范围。

    【讨论】:

    • @veereshG.S:很高兴它能以任何方式帮助你。
    • 是的,谢谢它现在的工作
    【解决方案3】:

    这就是问题所在……您加入太空。将其更改为以下内容。

    def swap(c, i, j):
      c[i], c[j] = c[j], c[i]
      return ''.join(c)
    

    对于您的输出,您还可以执行以下操作。

    l = [x for x in [your output list] if x!= ' ']
    

    l = [x for x in [your output list] if len(x.strip()) > 0]
    

    【讨论】:

      【解决方案4】:

      尝试仅返回“C”并使用递归交换列表的所有元素然后您将获得预期的输出。检查下面的代码。

      以下代码的输出:['b','a','d','c','f','e']

      s = ['a','b','c','d','e','f']
      
      def swap(c, i, j):
          if j<=len(c) and len(c)%2==0:
              c[i], c[j] = c[j], c[i]
              swap(c,i+2,j+2)
          elif j<len(c):
              c[i], c[j] = c[j], c[i]
              swap(c,i+2,j+2)
          return c
      
      result = swap(s, 0, 1)
      print(list(result))
      

      如果你想要 Only output= ['b','a','c','d','e','f'] 那么不需要递归就返回 c。检查以下代码:

      s = ['a','b','c','d','e','f']
      
      def swap(c, i, j):
          c[i], c[j] = c[j], c[i]
          return c
      
      result = swap(s, 0, 1)
      print(list(result))
      

      【讨论】:

      • 您的递归对于序列中的奇数个元素会失败。此外,带有range 的简单for loop 需要更少的代码行;-)
      • 现在您可以重新检查我刚刚更改的代码现在它适用于列表的奇数或偶数长度
      • 好吧,似乎工作正常。顺便说一句,if j&lt;len(c) 使您的原始解决方案工作正常。
      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2014-01-02
      相关资源
      最近更新 更多