【问题标题】:How to switch position of two items in a Python list?如何在 Python 列表中切换两个项目的位置?
【发布时间】:2011-01-30 10:30:00
【问题描述】:

我一直没能在网上找到很好的解决这个问题的方法(可能是因为switch、position、list和python都是这么重载的词)。

这很简单——我有这个清单:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']

我想切换'password2''password1' 的位置——不知道它们的确切位置,只知道它们是紧挨着的,password2 是第一个。

我已经通过一些冗长的列表下标实现了这一点,但我想知道它是否可以想出一些更优雅的东西?

【问题讨论】:

  • 你的问题是试图在列表中找到'password2'的效率吗? “password1”可以在“password2”之前吗?您的原始问题中是否存在一些复杂性?否则我同意@unwind。
  • 你应该发布你所拥有的 - 我很好奇你所说的“相当冗长的列表下标”是什么意思。
  • 类似于 index1 = index('password1'); index2 = index('密码2'); order = order[:index2].append(order[index1]).append(order[index2]).append(order[index1 + 1:]);传播到几行。漂亮,不。

标签: python list


【解决方案1】:
i = ['title', 'email', 'password2', 'password1', 'first_name', 
     'last_name', 'next', 'newsletter']
a, b = i.index('password2'), i.index('password1')
i[b], i[a] = i[a], i[b]

【讨论】:

    【解决方案2】:
    for i in range(len(arr)):
        if l[-1] > l[i]:
            l[-1], l[i] = l[i], l[-1]
            break
    

    因此,如果最后一个元素大于位置 i 的元素,那么它们都会被交换。

    【讨论】:

      【解决方案3】:

      我不是 python 专家,但您可以尝试: 说

      i = (1,2)
      
      res = lambda i: (i[1],i[0])
      print 'res(1, 2) = {0}'.format(res(1, 2)) 
      

      上面会给出 o/p 为:

      res(1, 2) = (2,1)
      

      【讨论】:

      • 如果不知道要交换的键的位置,这是行不通的。
      【解决方案4】:

      你可以使用例如:

      >>> test_list = ['title', 'email', 'password2', 'password1', 'first_name',
                       'last_name', 'next', 'newsletter']
      >>> reorder_func = lambda x: x.insert(x.index('password2'),  x.pop(x.index('password2')+1))
      >>> reorder_func(test_list)
      >>> test_list
      ... ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']
      

      【讨论】:

        【解决方案5】:

        鉴于您的规格,我会使用切片分配:

        >>> L = ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
        >>> i = L.index('password2')
        >>> L[i:i+2] = L[i+1:i-1:-1]
        >>> L
        ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']
        

        切片赋值的右侧是“反转切片”,也可以拼写:

        L[i:i+2] = reversed(L[i:i+2])
        

        如果您发现它更具可读性,很多人都会这样做。

        【讨论】:

        • 如果你想切换标题和邮件,第一个元素和第二个元素,为什么这不起作用?
        • 对不起,我现在明白了,i-1 没有元素,所以返回一个空列表
        【解决方案6】:

        简单的 Python 交换如下所示:

        foo[i], foo[j] = foo[j], foo[i]
        

        现在您需要做的就是弄清楚i 是什么,而这可以通过index 轻松完成:

        i = foo.index("password2")
        

        【讨论】:

          【解决方案7】:

          它怎么可能比它更长

          tmp = my_list[indexOfPwd2]
          my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
          my_list[indexOfPwd2 + 1] = tmp
          

          这只是使用临时存储的普通交换。

          【讨论】:

          • 如果你想成为真正的“Pythonic”,你也可以这样做:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
          猜你喜欢
          • 1970-01-01
          • 2018-09-10
          • 2013-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多