簡體   English   中英

更有效地使用itertools.groupby()

[英]more efficient use of itertools.groupby()

我正在努力增強我對itertools庫的了解,因為它通常很有用。 為此,我試圖解決我遇到的一個采訪益智游戲。 其中很大一部分涉及順序計算一個數字內的分組和重復數字的數量。 例如,對於數字:

1223444556

我想要:

[(1,1),(2,2),(1,3),(3,4),(2,5),(1,6)]

也就是說,從左到右,有1個,2個,2個,1個,等等。

這是我目前的代碼:

from itertools import groupby
groups_first = [int(''.join(v)[0]) for k,v in groupby(str(1223444556))]
counts = [len(''.join(v)) for k,v in groupby(str(1223444556))]
zip(counts,groups_first)

它有效,但我想知道的是,是否有一種更緊湊的方式來繞過兩個列表。 有什么想法嗎? 我想這可能會在groupby()中做一些lambda函數,但我還沒看到它。

謝謝!

我可能只是寫

>>> n = 1223444556
>>> [(len(list(g)), int(k)) for k,g in groupby(str(n))]
[(1, 1), (2, 2), (1, 3), (3, 4), (2, 5), (1, 6)]

怎么樣:

[(sum(1 for _ in v), int(k)) for k,v in groupby(str(1223444556))]

我可能會選擇收藏:

>>> from collections import Counter
>>> c = Counter('1223444556')
>>> c.items()
[('1', 1), ('3', 1), ('2', 2), ('5', 2), ('4', 3), ('6', 1)]

如果訂單很重要(正如您在評論中所說),這可能不再是最有效的方法。 但要充分考慮,你可以這樣做:

>>> t = c.items()
>>> t = sorted(t)

如果你想要y,x被列為x,y,你可以這樣做:

>>> t = [(y, x) for x, y in t]
>>> print t
[(1, '1'), (2, '2'), (1, '3'), (3, '4'), (2, '5'), (1, '6')]

此方法的一個值是重復元素被列為字符串,因此不會混淆哪個數字來自原始列表,哪個數字表示頻率。

暫無
暫無

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

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