2017-05-26 21 views
0

我正在嘗試構建一個函數,它可以在不導入庫/包的情況下獲取python列表中的等值線數。我可以用一個單獨的字符串來完成此操作,但在列表格式中很難這樣做。獲取Python列表中的等值線圖的數量

列表會像這樣:

l =['please', 'find', 'isograms', 'if', 'you', 'can'] 

函數應該返回4號,因爲琴絃的4不必重複字符。任何幫助將不勝感激。

+2

你可以發佈你用單數字符串完成的任務嗎? –

+0

*「我可以用一個單獨的字符串來完成此操作」* - 然後,只需將其放入一個循環並計數即可。 –

+0

歡迎來到SO。請閱讀[how-to-ask](http://stackoverflow.com/help/how-to-ask)以提供足夠的具體信息來描述您的問題。 – thewaywewere

回答

1

只需使用以下:

[len({}.fromkeys(x)) == len(x) for x in l].count(True) 

[len(set(x)) == len(x) for x in l].count(True) 

>>> l =['please', 'find', 'isograms', 'if', 'you', 'can'] 
>>> [len({}.fromkeys(x)) == len(x) for x in l].count(True) 
4 
>>> [len(set(x)) == len(x) for x in l].count(True) 
4 

這通過每個字符串轉換爲一個字典,從而消除了重複,並檢查長度是等於原始長度。然後它計算列表中True值的數量。

+0

或者你可以使用'set'。仍然+1 –

+0

@ t.m.adam真,無論是工作,將添加:) –

0

您在問題中聲明您可以確定單個字符串是否爲等值線圖。我假設這意味着您已經有一個函數is_isogram(string),如果string是等值線,則返回True,否則返回False

如果是這樣,嘗試:

count = sum(is_isogram(s) for s in l) 

sum函數內部生成器表達式基本上只是計算的is_isogram每個項目在l的值(一個或TrueFalse值)。 sum函數然後隱式地將這些布爾值轉換爲它們的整數等效值(即1對於True0對於False),並且計算總和。由於列表中每個等值線圖應該有一個1,因此總和應該等於等值線圖的數量。

如果不是一個功能必須用於測試等值線圖(例如len(set(string)) == len(string))的一些表達,然後簡單地代替is_isogram(string)的替代在上面的代碼,例如:

count = sum((len(set(s)) == len(s)) for s in l) 
0
len([word for word in l if len(word) == len(set(word))]) 

(其中部分len(word) == len(set(word))意味着只包含不重複字符的單詞,因爲在set(word)不包含重複項)。