我有4个这样的项目列表:
a, b, c, d = [1, 2, 3, 4]
我正在重新排序列表,翻转每一对:
[b, a, d, c]
有没有办法在一个表达式中执行此操作?我已经尝试过使用列表理解和解包,但似乎无法正确使用它。
我有[1,2,3,4]。我想要[2,1,4,3]。
答案 0 :(得分: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]
答案 1 :(得分: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]
>>>
答案 2 :(得分:2)
如果这只是大约4个成员名单 - 这就足够了:
list = [1, 2, 3, 4]
reordered_list = [list[1], list[0], list[3],list[2]]
答案 3 :(得分: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]
请注意,这仍适用于任意迭代,但抽象层次较少;你不能轻易地提高翻转子列表的大小,也不能输出迭代等等。
答案 4 :(得分: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
答案 5 :(得分: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
具有偶数个元素,则此功能正常工作。
答案 6 :(得分: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]
答案 7 :(得分:0)
我错过了什么吗?使用循环重新排序given_list
:
rez = []
for i in range(len(given_list)-1, -1, -1):
rez.append(given_list[i])
return rez