0

みなさん、こんにちは。Pythonの質問があります。

指定された文字列の各文字を1回だけ印刷しようとしています。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))

またはSet、配列の代わりにPythonが提供するデータ構造を使用します。セットは重複を許可しません。

aSet = set(letter_str)
于 2013-03-03T22:34:57.447 に答える
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 に答える
2

Malvolioは、答えは可能な限り単純であるべきだと正しく述べています。そのために、set可能な限り最も効率的で単純な方法で一意性の問題を処理するPythonのタイプを使用します。

ただし、彼の答えは句読点と間隔の削除を扱っていません。さらに、すべての回答と質問のコードは、それをかなり非効率的に行います(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 に答える
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

第一原理、クラリス。シンプルさ。

list(set(sentence_str))
于 2013-03-03T22:40:29.413 に答える
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 に答える