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']

没有错误...

4

6 回答 6

2

只需在添加之前检查该字母是否已在您的数组中:

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

或者使用SetPython 提供的数据结构而不是数组。集合不允许重复。

aSet = set(letter_str)
于 2013-03-03T22:34:57.447 回答
2

Malvolio 正确地指出答案应该尽可能简单。为此,我们使用 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)
于 2013-03-03T22:48:52.730 回答
2

使用 itertools ifilter你可以说它有一个隐式的for循环:

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'])
于 2013-03-03T22:39:27.750 回答
0

第一原则,克拉丽斯。简单。

list(set(sentence_str))
于 2013-03-03T22:40:29.413 回答
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(),然后打印。

于 2013-03-03T22:39:08.840 回答
0

您可以使用 set() 删除重复字符和 sorted():

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))
于 2013-03-03T22:53:59.683 回答