2017-11-11 35 views
3

我必須創建這個函數,它具有一個字符串和一個字符串列表作爲輸入;並輸出包含字符串的字符串索引列表。我已經完成了,但是我應該根據字符串中字符串的出現來對索引進行協調。我怎樣才能做到這一點?這是我的代碼: 我在'if'下添加了'count'來計算出現次數,我如何使用它來根據這個來統一指數?根據事件發生的座標元素的問題

+1

請輸入與預期的輸出。你需要使用鍵功能進行排序,但這不清楚你要問什麼 –

+1

你爲什麼使用計數?請給我們一個樣本輸入和輸出 – yash

+0

例如:function(「c」,[「hello」,「cure」,「access code」])----> output [2,1]現在它返回我[1 ,2] – darkwidow

回答

1

可以在每個字符串函數添加數列表,

def function(s,lst): 
    l=[] 
    counts = [] 
    for i in range(len(lst)): 
     if s in lst[i]: 
      counts += [lst[i].count(s)] 
      l += [i] 
    return l, counts 

這裏counts是每個條目是在您的輸入列表中的字符串中的s出現的次數的列表。該函數現在返回元組中的兩個列表,例如第一個元組元素爲l,第二個元素爲counts。請注意,i=-1在這裏是多餘的,因爲irange中迭代器的一個元素,並且在循環未更改其循環值之前爲其分配值。

您現在可以進行排序基於利用this後修飾線上的第二列表上的第一個列表,

out_fun = function(s,inp) 
out = [x for x,_ in sorted(zip(out_fun[0],out_fun[1]), key = lambda x: x[1], reverse=True)] 

inp是字符串列表,例如inp = ["hello", "cure", "access code"]out_fun是來自函數function的兩個列表的返回元組。 s是感興趣的字符串 - 在您的原始示例中,這是'c'

該行的功能是首先使用zip創建一個元組列表,其中元組的每個第一個元素都是來自索引列表的元素,第二個元素來自發生的列表。程序然後根據第二個元素以相反的順序對元組進行排序(最大的第一個)。列表理解僅提取排序結果中每個元組的第一個元素,這又是索引列表。

如果您對此解決方案有任何疑問,請隨時詢問。你有一個Python 2.7標籤 - 在Python 3.X中,你需要使用list(zip()),因爲zip返回一個zip對象而不是一個列表。


這是你的程序的更簡潔的版本:

def function(s,lst): 
    t = [(i,x.count(s)) for i,x in enumerate(lst) if s in x] 
    return t 

它使用列表理解創建並返回與第一個元素是具有字符串的索引元組t列表字符s,第二個是計數。這不一定更高效,需要檢查。但這是一個乾淨的單線,至少對我來說更具可讀性。

元組的列表可以比以類似的方式,以以前的方案進行排序,基於第二元組元素即計數上,

out_fun = function(s,inp) 
out = [x for x,_ in sorted(out_fun, key = lambda x: x[1], reverse=True)] 
+0

首先感謝您的回答。我現在正在嘗試寫下你寫的東西,而且我對這個解決方案几乎沒有疑問。第一:out_fun是一個新功能?第二:在第一行代碼中寫入''out_fun = function(s,inp)'',函數中的''inp'是什麼?第三:要退出out_fun,我必須創建一個新功能?對於所有這些問題抱歉,但我對python真的很陌生(我從上個月開始研究它),我只知道幾件簡單的事情。謝謝:) – darkwidow

+0

沒問題,我的壞 - 我應該添加輸入。我現在更新它:out_fun只是你函數的輸出,inp是字符串的輸入列表。 – atru

+0

我仔細閱讀,現在我明白了。我把out_fun放在我的函數中,並且工作正常。所以非常感謝。我會永遠感謝你:D – darkwidow