2017-07-20 53 views
0

可以說我有這樣的結構獲取一個導致在嵌套列表中的最大或最小的索引列表

[[[1,2],[3,4]],[[8,9],[7,7]]] 

我想要遍歷列表,並有這樣的結果:

[[3,2],[8,7]] 

這將會將第一級[[1,2],[3,4]]中的數組列表減少爲一個單一數組,其中第一個元素選擇的最大值和第二個元素的最小值選定。

我已經手動完成了它,只是迭代組,再次迭代,存儲第一個值並查看下一個是更大還是更小,我將它存儲在列表中並創建另一個列表。

我想找到一個更優雅的方法與列表解析等,我敢肯定,我可以使用壓縮在這裏分組的值在同一組,但我迄今沒有成功。

回答

1

您可以使用zip,並通過解壓縮結果爲單個值這是很容易做到的,你在找什麼,比如:

>>> x = [[[1,2],[3,4]],[[8,9],[7,7]]] 
>>> [[max(a), min(b)] for k in x for a, b in [zip(*k)]] 
[[3, 2], [8, 7]] 

沒有拆包的另一種方法是有一個騎自行車的功能迭代(max, min, max, min, ...),並使用嵌套列表解析,例如:

>>> import itertools as it 
>>> maxmin = it.cycle([max, min]) 
>>> [[next(maxmin)(a) for a in zip(*k)] for k in x] 
[[3, 2], [8, 7]] 

或者索引的函數的列表:

>>> import itertools as it 
>>> maxmin = [max, min] 
>>> [[maxmin[i](a) for i, a in enumerate(zip(*k))] for k in x] 
[[3, 2], [8, 7]] 
+0

我不一定要使用zip,這正是我可能會幫助的。我會看看這是如何適用的,這些清單實際上有四個要素。 – Trufa

+0

評論是在編輯之前的回答,我會檢查這一個。 – Trufa

+0

你是什麼意思4個元素,你能給出一個更完整的例子嗎?這並不關心你有多少'對',或者你有多少'對',但如果你有多於'對',雖然很容易擴展,但不會工作 - 'a,b,c,d' – AChampion

1

這將在不壓縮的工作:

mylist = [[[1,2],[3,4]],[[8,9],[7,7]]] 
[[max(y[0] for y in x), min(y[1] for y in x)] for x in mylist] 

這樣做的主要缺點是,它看起來通過每個子列表兩次,第一次發現(第一項)最大,一旦找到最低(第二項)。

+0

哦,不錯,這看起來幾乎是我所需要的,唯一的問題是我有四個,所以我將不得不迭代四次...但我不認爲這是性能依賴。我會放棄它。 – Trufa