【问题标题】:How to delete lower case from a list and reverse it如何从列表中删除小写字母并将其反转
【发布时间】:2015-10-23 02:05:12
【问题描述】:

目的是试图反转消息,删除所有以小写字母开头的字符串,最后将所有内容变为小写。

这是我的代码:

msg = input('code: ')
msg = msg.split()
msg = list(reversed(msg))
for i in msg:
  if i[0] == i[0].lower:
    del msg[i]
msg = ' '.join(msg)
msg = msg.lower()
print(msg)

这是一个例子

BaSe fOO ThE AttAcK

然后会变成

attack the base

非常感谢你们!!!!!!!!!所以我回去编辑我的代码:

new_msg = []
msg = input('code: ')
msg = msg.split()
msg = list(reversed(msg))
for word in msg:
  if not word[0].islower():
    new_msg.append(word.lower())
new_msg = ' '.join(new_msg)
print("says:",new_msg)

我回去标记它,但它说你不能有标点符号!是的,我想我又需要帮助了,我该如何摆脱它们?

【问题讨论】:

标签: python list reverse lowercase


【解决方案1】:
new_msg = []
msg = msg.split()
for word in msg: #For every word in the string
    if not word[0].islower(): #if it starts with anything other than lowercase
        new_msg.append(word.lower()) #add to new list
new_msg = ' '.join(new_msg[::-1]) #Reverse order of list and make into string

【讨论】:

  • 此代码保留以小写字母开头的字符串; OP 要求 删除 以小写字母开头的字符串。这可以通过更改为if not word[0].islower() 来解决。此外,此代码不会将保留的字符串转换为小写。它也不会产生一个字符串——它会产生一个列表。
  • 已修复。它实际上产生了一个迭代器,而不是一个字符串(所以,更糟!)
  • 这稍微好一点,但仍然是错误的。如果单词以数字、标点符号或其他非字母字符开头怎么办? OP 请求“删除所有以小写字母开头的字符串”,例如1abcd 应该保留,但您的代码会删除它。 if not word[0].islower(): 是正确的做法。
  • 很公平!更新(再次:))
【解决方案2】:

这就是为什么你的代码不能工作,至少:

>>> i = 'fOO'

>>> i[0] == i[0].lower     # huh?
False

>>> i[0].lower             # oh!
<built-in method lower of str object at 0x00249F40>

>>> i[0].lower()           # we forgot to *call* it
'f'

>>> i[0] == i[0].lower()   # perfect!
True

您正在将字符串与方法对象进行比较——这就是条件永远不会被命中的原因。

如果你修复了这个错误,它仍然无法工作;您正在删除 msg['fOO'],这没有任何意义!尝试使用enumerate() 来获取索引以及列表中的字符串。

(然后它仍然不起作用。你能找出原因吗?)

【讨论】:

    【解决方案3】:

    这看起来有点吓人,但我会解释一下。

    s = "BaSe fOO ThE AttAcK"
    print ' '.join(reversed([word.lower() for word in s.split(' ') if not word[0].islower()]))
    

    我在这里所做的是将 s 拆分为单个空格 ' ',然后创建一个列表,其中包含任何不是单个 ' ' 的内容。然后,我遍历“单词”列表并使用内置的 lower 方法将每个单词转换为更低,只有当单词的第一个字符(我们通过调用第 0 个索引得到)不更低时。最后我们加入我们使用 join 方法创建的列表。

    编辑:我忘记反转列表了。

    【讨论】:

    • 这是迄今为止唯一正确的替代实现。 FWIW,如果在连接的字符串上而不是在列表理解中执行转换为小写,它可能会稍微更有效。
    • 是的,那样会更有效率,不错。
    【解决方案4】:
    string = raw_input().split()                                                     
    string2 = []                                                                     
    for i in range(len(string)):                                                     
        if not string[i].[0].islower():                  
            string2.insert(0,string[i].lower())                                              
    print ' '.join(string2)                                                          
    

    【讨论】:

    • 使用 islower() 而不是 ASCII 值。前者适用于非 ASCII 字符。此外,以小写z 开头的单词不会按要求删除-您可能是指&lt;= 122
    • 试试string[i][0].islower() 而不是string[i].[0].islower()
    【解决方案5】:

    我建议您在任何情况下都不要删除 list/Dict 迭代中的任何元素。 如果你这样做,那就错了。

    这样:

    sMsg="BaSe fOO The AttAck"
    lstMsg=sMsg.split(" ")
    for i in xrange(len(lstMsg)):
        if lstMsg[i][0].islower():
            del lstMsg[i]
    

    【讨论】:

      【解决方案6】:
      " ".join([word.lower() for word in reversed(msg.split()) if not word[0].islower()])
      

      【讨论】:

      • 如果其中一个单词以数字或标点符号开头怎么办?与 OP 的要求相反,此代码将删除它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      相关资源
      最近更新 更多