簡體   English   中英

Python:如何將“扁平”序列轉換為元組序列?

[英]Python: How to transform a 'flat' sequence into a sequence of tuples?

我需要從一維坐標列表中列出2元組的列表,例如[1, 2, 1, 5]變為[(1, 2), (1, 5)] 碰巧的是,我已經在Activestate處找到了最快,最通用的方法,但是相對於Python新手來說,這里列出的代碼是不透明的:

def group3(lst, n):
    return itertools.izip(*[itertools.islice(lst, i, None, n) for i in range(n)])

誰能用英語解釋這段代碼在做什么? 在這種情況下,星號在做什么? 謝謝。

itertools.islice函數可以從任何可迭代對象中生成一個切片。 該聲明:

itertools.islice(lst, 0, None, 2)

用簡化的術語表示“返回一個迭代器,該迭代器在被求值時將首先從元素0開始返回所有其他元素”。 0 arg是起始點, 2是步長值(跳過多少以獲得下一個值)

最好使用6元素列表來說明,因為看[(1, 2), (1, 5)] ,可能不清楚哪個函數產生內部元組(直到最終izip才產生它們) 。

>>> lst = [1, 2, 3, 4, 5, 6]
>>> list(itertools.islice(lst, 0, None, 2))
[1, 3, 5]
>>> list(itertools.islice(lst, 0, None, 2))
[2, 4, 6]

在發電機上使用時要小心; 第一次調用將遍歷整個序列,從而消耗生成器的電量:

>>> def foo():
...     for i in range(6):
...         yield i + 1
>>>
>>> gen = foo()
>>> list(itertools.islice(gen, 0, None, 2)
[1, 3, 5]
>>> list(itertools.islice(gen, 1, None, 2)
[]

您的函數需要產生2個序列,即奇數和偶數。 這是列表理解的地方:

>>> [itertools.islice(lst, i, None, 2) for i in range(2)]
[<itertools.islice object at 0x7f958a79eaf8>, <itertools.islice object at 0x7f958a79eaa0>]

現在,您有2個islice對象准備好進行交織了。 為此,我們可以使用zip ,但是itertools.izip效率更高,因為它返回一個迭代器:

>>> list(zip([1, 3, 5], [2, 4, 6]))
[(1, 2), (3, 4), (5, 6)]
>>> tmp = itertools.izip(*[itertools.islice(lst, i, None, 2) for i in range(2)])
>>> tmp
<itertools.izip object at 0x7f958a7b6cf8>
>>> list(tmp)
[(1, 2), (3, 4), (5, 6)]

希望這有助於闡明步驟。

這是2元組的替代版本(不如活動狀態配方一般):

>>> x = [1,2,3,4,5,6,7,8]
>>> [ (x.pop(0), x.pop(0)) for item in range(len(x)/2) ]
[(1, 2), (3, 4), (5, 6), (7, 8)]

通過從列表中彈出前兩個數字,直到沒有更多的對,形成一個二元組列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM