【问题标题】:Reorder Python List重新排序 Python 列表
【发布时间】:2013-11-01 22:12:01
【问题描述】:

我有一个这样的 4 项列表:

a, b, c, d = [1, 2, 3, 4]

我正在重新排列列表,翻转每一对:

[b, a, d, c]

有没有办法在一个表达式中做到这一点?我尝试过使用列表理解和解包,但似乎无法正确使用。

我有 [1, 2, 3, 4]。我正在尝试获得 [2, 1, 4, 3]。

【问题讨论】:

标签: python


【解决方案1】:

更一般地说,如果您要翻转列表中的数字对:

>>> L = [1, 2, 3, 4, 5, 6]
>>> from itertools import chain
>>> list(chain.from_iterable(zip(L[1::2], L[::2])))
[2, 1, 4, 3, 6, 5]

【讨论】:

    【解决方案2】:

    看看这个:

    >>> lst = [1, 2, 3, 4]
    >>> [y for x in zip(*[iter(lst)]*2) for y in x[::-1]]
    [2, 1, 4, 3]
    >>>
    >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> [y for x in zip(*[iter(lst)]*2) for y in x[::-1]]
    [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
    >>>
    

    【讨论】:

    • 光滑。将不得不花一些时间弄清楚这是如何工作的。
    • @nathancahill - 谢谢。我假设您了解列表理解部分。我对zipiter 所做的事情是一个非常有用的技巧,你应该记住(它被大量使用并且会真的帮助你)。这是它的参考:stackoverflow.com/questions/18541215/… 向下滚动到@abarnert 的答案。
    【解决方案3】:

    如果这只有大约 4 个成员列表 - 就足够了:

    list = [1, 2, 3, 4]
    reordered_list = [list[1], list[0], list[3],list[2]]
    

    【讨论】:

      【解决方案4】:

      因为绝对没有人给出适用于通用迭代的答案,

      from itertools import chain
      
      items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      
      zip(*[iter(items)]*2)
      #>>> <zip object at 0x7fd673afd050>
      
      [itms for itms in zip(*[iter(items)]*2)]
      #>>> [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
      

      所以zip(*[iter(x)]*2) 表示ix = iter(x); zip(ix, ix) 将每个元素配对。

      然后你可以反转:

      [(y, x) for (x, y) in zip(*[iter(items)]*2)]
      #>>> [(2, 1), (4, 3), (6, 5), (8, 7), (10, 9)]
      

      将它们放在一起并展平:

      [itm for (x, y) in zip(*[iter(items)]*2) for itm in (y, x)]
      #>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
      

      它是通用的短!


      如果您想以牺牲通用性为代价获得更快的速度,那么您将很难做到这一点:

      new = list(items)
      new[::2], new[1::2] = new[1::2], new[::2]
      
      new
      #>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
      

      请注意,这仍然适用于任意迭代,但抽象层更少;您不能轻易增加翻转子列表的大小,也不能输出可迭代对象等。

      【讨论】:

      • 优秀的答案。感谢您逐步分解。
      【解决方案5】:

      你是这个意思吗:

      >>> a, b, c, d = [1, 2, 3, 4]
      >>> b, a, d, c = a, b, c, d
      >>> a
      2
      >>> b
      1
      >>> c
      4
      >>> d
      3
      

      ?

      【讨论】:

      • 不,我不想重新分配变量,我想从 [1, 2, 3, 4] 中获取 [2, 1, 4, 3]
      【解决方案6】:

      试试这个列表理解解决方案:

      a = [1,2,3,4,5,6] # Any list with even number of elements
      b = [a[e+1] if (e%2 == 0) else a[e-1] for e in range(len(a))]
      

      这仅适用于列表 a 的元素数量为偶数的情况。

      【讨论】:

        【解决方案7】:
        In [1]: l = [1, 2, 3, 4]
        
        In [2]: list(chain(*map(reversed, zip(l[::2], l[1::2]))))
        Out[2]: [2, 1, 4, 3]
        

        【讨论】:

          【解决方案8】:

          我错过了什么吗?使用循环重新排序given_list

          rez = []
          for i in range(len(given_list)-1, -1, -1):
              rez.append(given_list[i])
          return rez
          

          【讨论】:

            猜你喜欢
            • 2015-09-16
            • 1970-01-01
            • 2017-04-28
            • 2019-09-18
            • 1970-01-01
            • 2023-02-21
            • 1970-01-01
            • 2019-11-29
            • 1970-01-01
            相关资源
            最近更新 更多