我有一個 python 分配從字串中提取二元組到字典中,我想我已經在網上找到了解決方案,但不記得我在哪里找到它。但它似乎有效,但我無法理解它,因為我是 python 新手。誰能解釋下面的代碼,它接受一個字串并將字符提取到元組中并計算實體并將其放入字典中
'''
s = 'Mississippi' # Your string
# Dictionary comprehension
dic_ = {k : s.count(k) for k in{s[i] s[i 1] for i in range(len(s)-1)}}
'''
uj5u.com熱心網友回復:
首先讓我們理解理解:
串列、字典、集合等可以通過理解來制作。基本上,理解是使用一個生成器并使用它來形成一個新變數。生成器只是一個在每次迭代時回傳不同值的物件,因此以串列為例:為了創建一個具有串列推導式的串列,我們將生成器輸出的值放入串列中自己的位置。以這個生成器為例:
x for x in range(0, 10)
這只會在第一次迭代時給出 0,然后是 1,然后是 2,等等。所以要使這個串列成為我們將使用的串列[](串列剎車),如下所示:
[x for x in range(0, 10)]
這將給出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #note: range does not include the second input
對于字典和我們使用的集合{},但是由于字典使用鍵值對,我們的生成器對于集合和字典將是不同的。對于集合,它與串列相同:
{x for x in range(0, 10)} #gives the set --> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
但是對于字典,我們需要一個鍵和一個值。由于enumerate給出了兩個專案,這在某些情況下可能對字典有用:
{key: value for key, value in enumerate([1,2,3])}
在這種情況下,鍵是索引,值是串列中的專案。所以這給出了:
{0: 1, 1: 2, 2: 3} #dictionary
它不構成集合,因為我們表示x : y的是字典中專案的格式,而不是集合。
現在,讓我們分解一下:
這部分代碼:
{s[i] s[i 1] for i in range(len(s)-1)}
正在制作一組值,即每對接觸的字母,s[i]是一個字母,s[i 1]是后面的字母,所以它是說獲取這對(s[i] s[i 1])并為字串中的每個專案(for i in range(len(s)-1)-1letter 后面沒有感人的字母(所以我們不想為最后一個字母運行它)。
現在我們有了一個集合,讓我們將它保存到一個變數中,這樣更容易看到:
setOfPairs = {s[i] s[i 1] for i in range(len(s)-1)}
那么我們原來的理解會變成:
{k : s.count(k) for k in setOfPairs}
這就是說我們想要創建一個字典,它的鍵k和值是,s.count(k)因為我們k從對串列中獲取每個:for k in setOfPairs字典的鍵就是對。由于s.count(k)回傳的次數k是 in s,所以字典的值是鍵出現的次數s。
uj5u.com熱心網友回復:
讓我們一步一步地分開:
s[i]是選擇字串中第 i 個字母的代碼s。s[i] s[i 1]連接 position 處i的字母和 position 處的字母i 1。s[i] s[i 1] for i in range(len(s)-1)迭代每個索引i(除了最后一個),因此計算所有的二元組。- 由于 3 中的運算式被大括號包圍,因此結果是一個集合,這意味著所有重復的二元組都被洗掉。
for k in {s[i] s[i 1] for i in range(len(s)-1)}因此迭代給定字串中的所有唯一二元組s。- 最后,
{k : s.count(k) for k in{s[i] s[i 1] for i in range(len(s)-1)}}將每個二元組映射k到它在 中出現的次數s,因為該str.count函式回傳子字串在字串中出現的次數。
我希望這會有所幫助。如果您想了解更多關于 Python 中的 list/set/dict 推導式,請參閱 Python 檔案中的相關條目:https ://docs.python.org/3/tutorial/datastructures.html?highlight=comprehension#list-理解
uj5u.com熱心網友回復:
dic_ = {k : s.count(k) for k in{s[i] s[i 1] for i in range(len(s)-1)}}
倒著讀
dic_ = {k : s.count(k)
## Step 3 with each of the pair of characters
count how many are in the string
store the 2 char string as the key and the count as the value for the dictionary.
for k in{s[i] s[i 1]
# Step 2 From each of the position take 2 characters out of the string
for i in range(len(s)-1)}}
# Step 1 loop over all but the last character of the string.
對于具有多次重復的長字串,該代碼可能效率低下。第 2 步獲取每一對,因此計數和存盤將重復計數。重構以便您可以測驗密鑰是否已經存在并且不重復計數可能會加快速度。基準時間……比如說十億個堿基對 DNA 序列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429005.html
