3

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

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

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

[b, a, d, c]

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

我有 [1, 2, 3, 4]。我试图得到 [2, 1, 4, 3]。

4

8 回答 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]
于 2013-11-01T22:17:31.203 回答
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]
>>>
于 2013-11-01T22:15:48.240 回答
2

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

list = [1, 2, 3, 4]
reordered_list = [list[1], list[0], list[3],list[2]]
于 2013-11-01T22:17:37.657 回答
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)哪个对每个元素。

然后你可以反转:

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

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

于 2013-11-01T22:27:06.487 回答
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

?

于 2013-11-01T22:14:08.583 回答
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具有偶数个元素时才有效。

于 2013-11-01T22:18:49.950 回答
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]
于 2013-11-01T22:18:55.423 回答
0

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

rez = []
for i in range(len(given_list)-1, -1, -1):
    rez.append(given_list[i])
return rez
于 2016-03-08T07:54:05.620 回答