0

文字列オブジェクトで満たされたリストがあります。文字列オブジェクトが で終わる場合、文字列Wから を削除/削除したいW。また、文字列が等しい場合にのみ、.UWを削除したくありませんW

私はこれを試しました:

masterAbrevs = []

for subject in masterAbrevs:
    if subject.endswith("W"):
        subject =  subject[:-1]

印刷masterAbrevsした後、私のコードはまったく何もしていないように見えます。親切に助けてください。

4

4 に答える 4

6

問題は、リスト内の要素に変更を加えていないことです。リストから返された要素を保持する変数に変更を加えています。

代わりにこれを試してください:

masterAbrevs = ['ASW', 'AS', 'UW']

for i, e in enumerate(masterAbrevs):
    if (e[-1] == 'W') and (e != 'UW'):
        masterAbrevs[i] = masterAbrevs[i][:-1]

# results in ['AS', 'AS', 'UW']
于 2015-01-04T05:14:09.023 に答える
1

ここを利用する必要がありenumerate()ます。

masterAbrevs = ['aksdjfW', 'adW', 'UW', 'tttttW']

for ind, subject in enumerate(masterAbrevs):
    if subject.endswith("W") and subject[-2] != 'U':
        masterAbrevs[ind] = subject[:-1]

print masterAbrevs
# ['aksdjf', 'ad', 'UW', 'ttttt']
于 2015-01-04T05:15:02.743 に答える
1

ジェネレーターまたはマップ式を使用して内部文字列の操作をカプセル化する別のアプローチを検討することもできます。

def rstrip_most_ws(s):
    '''Remove trailing 'W' if s is not 'UW'
    '''
    if s != 'UW' and s[-1] == 'W':
        return s[:-1]
    return s

masterAbrevs = (rstrip_most_ws(s) for s in masterAbrevs)

文字列をその場で手動で変更する方が効率的に見えるかもしれませんが、Python にはジェネレーター式とリスト式が最適化されているため、このアプローチはそれほど遅くはないかもしれません。

于 2015-01-04T05:35:34.777 に答える
1

よりpythonicな答えに感謝するかもしれません:

masterAbrevs = ['aksdjfW', 'adW', 'UW', 'tttttW']
masterAbrevs = [abrev[:-1] if (abrev.endswith("W") and abrev != "UW") else abrev for abrev in masterAbrevs]
于 2015-01-04T05:25:03.083 に答える