【问题标题】:Removing all characters from python list except some capital letter从python列表中删除所有字符,除了一些大写字母
【发布时间】:2017-02-27 19:33:35
【问题描述】:

我在 python 中有一个列表,其中包含许多不同的字符,例如空格、|、>、数字和小写字母,但我只想保留一些大写字母(A、B、C、D)。如果我尝试这个,它不起作用,我几乎得到了想要的列表,但不仅 A、B、C、D 仍然存在。

with open("text.mfa") as f:
     content = f.read()
mylist = list(content)

letters = ['A','B','C','D']
i = 0
while i < (len(mylist)-1)
     if mylist[i] != letters[0] or letters[1] or letters[2] or letters[3]
            mylist.remove(mylist[i])
     i+=1

【问题讨论】:

  • 您与or 的比较是错误的。在每个 or 之后复制第一个测试
  • 另外,使用 for 循环,并且在迭代列表时不要修改列表。
  • 你也可以import string 然后使用if mylist[i] not in set(string.ascii_uppercase): 但是你在迭代期间修改了一个列表,这会导致问题,例如我假设您将使用此代码访问IndexError。只需构建一个不同的列表,其中只包含您确实想要的字符。
  • i+=1 应该在else 中,如果你沿着这条路走。

标签: python


【解决方案1】:

更 Pythonic 的方式可能是使用列表推导和 in 运算符:

mylist = [x for x in content if x in letters]

【讨论】:

  • 认为您可能需要删除 not。据我了解,OP 希望保留出现在字母中的所有字符,并排除那些没有出现的字符,而您正在做完全相反的操作。
  • @JavoSN。谢谢你的收获。我误读了这个问题。固定。
【解决方案2】:

尝试使用过滤器。

myfilteredlist = list(filter(lambda s: s in letters, mylist))

【讨论】:

  • 只有这种过滤方式才能解决这个问题。谢谢!
【解决方案3】:

让我们看看你的 if 语句:

if mylist[i] != letters[0] or letters[1] or letters[2] or letters[3]

如果放在括号中,python 会将其处理为:

if (mylist[i] != letters[0]) or (letters[1]) or (letters[2]) or (letters[3]):

每个字符的计算结果都为 True,这意味着因为 letters[1] 等计算结果为 true,所以您总是将整个表达式计算为 True。

【讨论】:

  • 我觉得这里少了点什么。否则,您只需发表评论(@MosesKoledoye 已经发表)
  • Jep,抱歉:s 不小心按下了提交按钮,为什么要添加代码示例...
  • 已撤回。我也经常发生,尤其是在移动设备上。
【解决方案4】:

使用in 而不是or(这会检查元素是否在列表中)。

if not mylist[i] in letters:
    mylist.remove(mylist[i])

【讨论】:

    【解决方案5】:

    您可以使用 for 循环而不是 while 循环,因为 for 循环会迭代一组值。要检查单词是否是字母,您可以这样做:

    with open("text.mfa") as f:
         mylist = list(f.read())
    mynewlist = []
    letters = ['A','B','C','D']
    for word in mylist:
          if word not in letters: #if word is not in letters
                mynewlist.append(word) #adds the word to a new list
    

    【讨论】:

    • 在迭代列表时从列表中删除东西总是一个坏主意。
    • 你说得对,我什至没有意识到。刚刚相应地回答了
    • 另外,这并不完全是 Python。关键字不应大写。
    • @MadPhysicist 对不起,我在用手机,它会自动将所有内容大写:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多