重新排列Python列表

3

我有一个包含4个项目的列表,如下所示:

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

我正在重新排序列表,翻转每一对:
[b, a, d, c]

有没有一种方法可以用一个表达式实现这个操作?我尝试使用列表推导和解包,但似乎无法做到。

我的初始列表是 [1, 2, 3, 4]。我想获取的结果是 [2, 1, 4, 3]。


请看以下链接:https://dev59.com/pHE95IYBdhLWcg3wCJNf#2493980。 - karthikr
你能详细说明一下你期望的输入和输出是什么吗? - jterrace
你的意思不是期望输出 [2,1,4,3] 吗? - Christian Tapia
8个回答

8
更为通用的情况是,如果您想要在列表中翻转一对数字:
>>> 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]

5

看一下这个:

>>> 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]
>>>

Slick。我得花点时间弄清楚它是如何工作的。 - nathancahill
@nathancahill - 谢谢。我假设你理解了列表推导式的部分。我使用zipiter的技巧非常有帮助,你应该记住它(它经常被使用,而且会_真正_帮助你)。这里有一个关于它的参考链接:http://stackoverflow.com/questions/18541215/how-do-you-access-a-list-in-group-of-3-in-python 滚动到@abarnert的答案。 - user2555451

2
如果只涉及4个成员列表,那么以下内容就足够了:
list = [1, 2, 3, 4]
reordered_list = [list[1], list[0], list[3],list[2]]

1

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

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),它将每个元素成对配对。请注意保留html标签。

然后你可以翻转:

[(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]

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

非常好的回答。感谢您逐步分解解释。 - nathancahill

0

我有什么遗漏吗?使用循环重新排序given_list

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

0

您是指这个吗:

>>> 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]。 - nathancahill

0

尝试这个列表推导的解决方案:

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 元素数量为偶数时,这个才能正常工作。


0
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接