日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

利用Python實現外觀數列求解_python

作者:趙卓不凡 ? 更新時間: 2022-06-01 編程語言

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實現該功能的快捷方式,最后給出了整個問題求解的樣例代碼。

原文鏈接:https://blog.csdn.net/sgzqc/article/details/123670973

欄目分類
最近更新