我有這樣的4個項目的列表:重新排序Python列表
a, b, c, d = [1, 2, 3, 4]
我重新排序列表,翻轉每對:
[b, a, d, c]
有沒有辦法在一個做到這一點表達?我試過使用列表理解和解包,但似乎無法做到正確。
我有[1,2,3,4]。我試圖得到[2,1,4,3]。
我有這樣的4個項目的列表:重新排序Python列表
a, b, c, d = [1, 2, 3, 4]
我重新排序列表,翻轉每對:
[b, a, d, c]
有沒有辦法在一個做到這一點表達?我試過使用列表理解和解包,但似乎無法做到正確。
我有[1,2,3,4]。我試圖得到[2,1,4,3]。
更一般地,如果你正在尋找翻轉對數字的列表:
>>> 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]
你的意思是這樣的:
>>> 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] – nathancahill
看看這個:
>>> 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,1,4,3]。將不得不花費一些時間弄清楚這是如何工作的。 – nathancahill
@nathancahill - 謝謝。我假設你理解列表理解部分。我用'zip'和'iter'做的事情是一個非常有用的技巧,你應該記住(它已經用了很多,並且會幫助你)。這裏是它的參考:http://stackoverflow.com/questions/18541215/how-do-you-access-a-list-in-group-of-3-in-python向下滾動到@ abarnert的答案。 – iCodez
太棒了,謝謝你的回答和參考。 – nathancahill
如果這是隻有約4成員列表 - 這將足夠了:
list = [1, 2, 3, 4]
reordered_list = [list[1], list[0], list[3],list[2]]
嘿傢伙 - 爲什麼downvote完全正確的答案? – Artur
試試這個名單悟解決方案:
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
具有偶數個元素,這種方法正常。
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]
因爲絕對沒有人給上通用iterables問題的解答,
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]
這是通用和短!
如果你想要的東西在genericism犧牲速度更快,你會很難更好這樣的:
new = list(items)
new[::2], new[1::2] = new[1::2], new[::2]
new
#>>> [2, 1, 4, 3, 6, 5, 8, 7, 10, 9]
請注意,這仍然適用於任意iterables,但也有少層抽象;你不能輕易顛倒翻轉的子列表的大小,並且不能輸出迭代數等。
優秀的答案。感謝您一步一步的將其分解。 – nathancahill
我是否錯過了什麼?重新訂購given_list
帶回路:
rez = []
for i in range(len(given_list)-1, -1, -1):
rez.append(given_list[i])
return rez
http://stackoverflow.com/a/2493980/1628832? – karthikr
你能詳細說明你想要的輸入和輸出是什麼嗎? – jterrace
難道你不想要''[2,1,4,3]'作爲輸出嗎? – Christian