首頁 > 軟體

利用Python實現外觀數列求解

2022-03-29 13:04:21

1. 引言

事情的由來是這樣的,今天遇到一個非常有意思的題目,如下:

1–11–21–1211–111221–312211

觀察上述數位,找出其中的規律,並嘗試思考給出下一個數位?
哇偶,可以先仔細思考一下下。。。

2. 外觀數列

外觀數列是一個整數序列,從數位 1 開始,序列中的每一項都是對前一項的描述。

前五項如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
1 被讀作  "one 1"  ("一個一") , 即 11。
11 被讀作 "two 1s" ("兩個一"), 即 21。
21 被讀作 "one 2",  "one 1" ("一個二" ,  "一個一") , 即 1211。
依次類推。。>>>[key for key, group in groupby('AAAABBBCCDAABBB')]
[A, B, C, D, A, B]

找出規律後,我們可以很方便的知道第6項的數位為 312211, 第7項為 13112221。所以,我們可以編寫一個函數,來自動幫我們生成這個數列的某一項。

3. 程式碼思路

經過思考,我們你可以總結出核心問題的求解在於我們需要統計出一組數位在序列中出現的次數。

3.1 提取輸出的key

因為外觀數列中每個子項都是統計數位key出現的次數,所以我們可以利用groupby函數來獲取子項中需要描述的key值,

樣例如下:

>>>[key for key, group in groupby('AAAABBBCCDAABBB')]
[A, B, C, D, A, B]

3.2 提取每個key對應的value

正如上述輸出所展示的,我們使用groupby函數將同一key進行分組。因此,我們可以對每個key對應的value進行型別轉換,

如下:

>>>[list(group) for key, group in groupby('AAAABBBCCDAABBB')]
[['A', 'A', 'A', 'A'], ['B', 'B', 'B'], ['C', 'C'], ['D'], ['A', 'A'], ['B', 'B', 'B']]

3.3 統計每個group對應的長度

經過上述轉換,我們按照key值對數列中的子項進行了分組,進而我們可以獲取每個group的長度,程式碼如下:

>>>[len(list(group)) for key, group in groupby('AAAABBBCCDAABBB')]
[4, 3, 2, 1, 2, 3]

3.4 整合輸出

通過上述一步步的分析,我們已經很方便地使用groupby來實現我們需要的輸出了,我們只需要整合每個group分組後的長度以及其key即可,

程式碼如下:

>>>[(len(list(group)),key) for key, group in groupby('AAAABBBCCDAABBB')]
[(4, 'A'), (3, 'B'), (2, 'C'), (1, 'D'), (2, 'A'), (3, 'B')]

3.5 解決方案

正如以上的分析,我們知道元組包含每個值的計數和值本身。我們可以使用上面的邏輯,用Python來實現外觀數列的求解!

程式碼如下:

我們這裡列印該數列的前15項,即讓引數iterator = 15,此時的輸出如下:

4. 總結

本文通過一道非常有趣的題目引入了外觀數列的定義,然後通過舉例分析找出用Python實現該功能的快捷方式,最後給出了整個問題求解的樣例程式碼。

到此這篇關於利用Python實現外觀數列求解的文章就介紹到這了,更多相關Python外觀數列求解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com