0

我有一个充满字符串对象的列表。如果字符串对象以 a 结尾W,我想W从字符串中删除/移除 。此外,在字符串等于的唯一情况下,UW我不想删除W.

我试过这个:

masterAbrevs = []

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

打印后masterAbrevs,我的代码似乎什么也没做。请帮助。

4

4 回答 4

6

问题是您永远不会对列表中的元素进行更改;您正在更改保存从 list 返回的元素的变量。

试试这个:

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

认为您可能会欣赏一个更 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 回答
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 回答