2013-03-03 134 views
0

大家好我有一個python問題。如何只打印一次字符串中的每個字母

我試圖打印給定字符串中的每個字母只有一次。 如何使用for循環執行此操作並對從a到z的字母進行排序?

繼承人我有;

import string 

sentence_str = ("No punctuation should be attached to a word in your list, 
       e.g., end. Not a correct word, but end is.") 

letter_str = sentence_str 
letter_str = letter_str.lower() 

badchar_str = string.punctuation + string.whitespace 

Alist = [] 


for i in badchar_str: 
    letter_str = letter_str.replace(i,'') 


letter_str = list(letter_str) 
letter_str.sort() 

for i in letter_str: 
    Alist.append(i) 
    print(Alist)) 

答案我得到:

['a'] 
['a', 'a'] 
['a', 'a', 'a'] 
['a', 'a', 'a', 'a'] 
['a', 'a', 'a', 'a', 'a'] 
['a', 'a', 'a', 'a', 'a', 'b'] 
['a', 'a', 'a', 'a', 'a', 'b', 'b'] 
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'c'].... 

我需要:

['a', 'b', 'c', 'd', 'e', 'g', 'h', 'i', 'l', 'n', 'o', 'p', 'r', 's', 't', 'u', 'w', 'y'] 

沒有錯誤...

+0

你可以獲益適合從設置的數據結構http://docs.python.org/2/tutorial/datastructures.html#sets - 它看起來像你打印了很多比你應該更多(見縮進) – 2013-03-03 22:33:06

+0

'print(sorted) (set(sentence_str.lower())))' – jfs 2013-03-03 22:38:54

+0

@JF塞巴斯蒂安 - 很好,但它仍然包含標點符號... – 2013-03-03 22:45:05

回答

2

只是檢查信是不是已經在你的數組中追加前它:

for i in letter_str: 
    if not(i in Alist): 
     Alist.append(i) 
    print(Alist)) 

或者使用Python提供的Set數據結構來代替數組。套件不允許重複。

aSet = set(letter_str) 
+0

你的第二個例子可能只是'aSet = set(letter_str)'(除了打印,但除調試外似乎不是必需的) – 2013-03-03 22:41:32

+0

@MichaelMauderer謝謝,由於某種原因,我想如果我調用set整個字符串,我只會得到一個元素的集合,這將是字符串本身。不知道這套應用如何。 – 2013-03-03 22:43:39

+0

@HunterMcMillen它的工作原理是當你遍歷一個字符串時,你會得到每個單獨的字母。既然你可以把任何可迭代的東西轉換成一個集合,那麼可以假定'set()'意味着'set(<在迭代x>時獲得的所有元素)''。如果字符串是字母 – entropy 2013-03-03 22:51:59

0

如果要打印無關緊要的順序,你可以使用:

sentence_str = ("No punctuation should be attached to a word in your list, 
       e.g., end. Not a correct word, but end is.") 
badchar_str = string.punctuation + string.whitespace 
for i in badchar_str: 
    letter_str = letter_str.replace(i,'') 
print(set(sentence_str)) 

或者,如果你想在有序進行打印,你可以將其轉換回目錄和使用sort()然後打印。

2

使用itertools ifilter,你可以說有一個隱含的循環:

In [20]: a=[i for i in itertools.ifilter(lambda x: x.isalpha(), sentence_str.lower())] 

In [21]: set(a) 
Out[21]: 
set(['a', 
    'c', 
    'b', 
    'e', 
    'd', 
    'g', 
    'i', 
    'h', 
    'l', 
    'o', 
    'n', 
    'p', 
    's', 
    'r', 
    'u', 
    't', 
    'w', 
    'y']) 
+0

可以使用隱式集合理解進一步簡化。假設Python 2.7。 '我=我在itertools.ifilter(lambda x:x.isalpha(),sentence_str.lower())}' – Anorov 2013-03-04 00:53:43

2

馬伏里奧正確地指出,答案應該是儘可能簡單。爲此,我們使用python的set類型,它以最有效和最簡單的方式處理唯一性問題。

但是,他的回答並不涉及刪除標點和間距。此外,所有答案以及問題中的代碼都會非常低效(通過badchar_str循環並替換原始字符串)。

最好的(即最簡單,最有效的,以及地道的Python)的方式找到在句子中的所有獨特的字母是這樣的:如果你希望他們進行排序

import string 

sentence_str = ("No punctuation should be attached to a word in your list, 
       e.g., end. Not a correct word, but end is.") 

bad_chars = set(string.punctuation + string.whitespace) 
unique_letters = set(sentence_str.lower()) - bad_chars 

,只需更換最後符合:

unique_letters = sorted(set(sentence_str.lower()) - bad_chars) 
+0

非常感謝謝謝! – 2013-03-03 23:59:21

0

您可以使用set()用於刪除重複的字符和排序():

import string 

sentence_str = "No punctuation should be attached to a word in your list, e.g., end. Not a correct word, but end is." 

letter_str = sentence_str 
letter_str = letter_str.lower() 

badchar_str = string.punctuation + string.whitespace 

for i in badchar_str: 
    letter_str = letter_str.replace(i,'') 

characters = list(letter_str); 

print sorted(set(characters)) 
相關問題