[英]Python: Sorting a list of tuples, where the tuples contain objects and ints
[英]list of ints into a list of tuples python
[1, 109, 2, 109, 2, 130, 2, 131, 2, 132, 3, 28, 3, 127]
我有這個數組,我想把它變成一個元組列表,每個元組有2個值因此該列表變為[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
my_new_list = zip(my_list[0::2], my_list[1::2])
這將生成具有以下輸出的新列表
[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
這背后的過程非常簡單。 我們首先使用切片將現有列表拆分為兩個新列表。
print my_list[0::2] # [1, 2, 2, 2, 2, 3, 3]
print my_list[1::2] # [109, 109, 130, 131, 132, 28, 127]
然后使用zip將這兩個列表組合成一個元組列表。
print zip(my_list[0::2], my_list[1::2])
>>> it = iter(L)
>>> zip(*[it]*2)
[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
it = iter(L)
在初始列表中創建迭代器
[it]*2
包含兩次相同迭代器的列表。
*
在參數的第一個位置用於解壓縮參數,以便zip(*[it]*2)
變成zip(it,it)
。 雖然你可以使用zip(it,it)
, zip(*[it]*2)
是一個更通用的結構,可以擴展到結果元組中的任意數量的值。
這種方法的核心是每次迭代的zip
都試圖從每個參數中獲取一個值。 但事實證明,所有參數實際上都是相同的迭代器,因此每次都會產生一個新值。
另一種方法:
lst = [1, 109, 2, 109, 2, 130, 2, 131, 2, 132, 3, 28, 3, 127]
print [(lst[i], lst[i + 1]) for i in xrange(0, len(lst), 2)]
#[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
受ovgolovin的回答啟發:
>>> it=iter(L)
>>> [(el, next(it)) for el in it]
[(1, 109), (2, 109), (2, 130), (2, 131), (2, 132), (3, 28), (3, 127)]
可能會更容易看出它是如何工作的。 也可以反轉元組順序:
>>> it=iter(L)
>>> [(next(it), el) for el in it]
[(109, 1), (109, 2), (130, 2), (131, 2), (132, 2), (28, 3), (127, 3)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.