.lower()表示列表中的x,不起作用,但在另一个场景中起作用

2024-07-03 08:13:55 发布

您现在位置:Python中文网/ 问答频道 /正文

下面给出了:'int'对象没有属性'lower'。你知道吗

我想将我从传入参数创建的列表中的每一项都转换为小写。你知道吗

我把元组转换成列表,因为我的理解是元组是不能改变的 当我尝试小写时,我得到了错误。你知道吗

def is_purple(*lfp):
    lower1 = [i for i in lfp]
    empty_string = [x.lower() for x in lower1]
    return empty_string


print(is_purple(1,2,"colors","Purple"))  

但是,如果我这么做:

print([x.lower() for x in ["A","B","C"]])

它起作用了。我点击搜索并键入

.lower()不工作,我太笨了,看不出我做错了什么:(


Tags: 对象in列表forstringislowerempty
3条回答

您的问题源于这样一个事实:您给了is_purple一个int和string的列表。更准确地说,(int,int,string,string)。你知道吗

在这里我们可以看到1int类型,"Purple"是string类型,这对于Python来说不是问题,因为您可以在列表中混合和匹配类型。你知道吗

>>> type(1)
<class 'int'>
>>> type("Purple")
<class 'str'>

要解决您的问题,您可以假设您的目的是使用所有字符串,如第二个示例所示:

呼叫print(is_purple(str(1),str(2),"colors","Purple"))

或者直接将您的输入转换为str(注意str(i)

def is_purple(*lfp):
    lower1 = [str(i) for i in lfp]
    empty_string = [x.lower() for x in lower1]
    return empty_string

或者,如果你想要一个更紧凑的版本

def is_purple(*lfp): 
   return [str(i).lower() for i in lfp]

但是,如果您的lfp输入可能非常大,最好的解决方案是使用生成器,这是一种更轻、更高效的内存高级技术。你知道吗

def is_purple_gen(*lfp): 
   for i in lfp: 
      yield str(i).lower()

print(list(is_purple_gen(1,2,"colors","Purple"))  )                                                                                                                  
['1', '2', 'colors', 'purple']

注意,对于生成器,我必须添加list(),但是在lfp可能很大并且一次处理一个条目的情况下,生成器是最佳选择。你知道吗

您正在将多个值传递给is_purple两个int类型和两个string类型。lower()是一个只能在字符串上调用的函数,因此当您试图在int上调用它时,它将抛出一个错误

在第二个示例中,您只对.lower()对象调用string,因此它确实有效。你知道吗

因为,列表中没有字符串。只有字符串具有.lower()函数。因此,在执行.lower()之前,请检查它是否是字符串:

def is_purple(*lfp):
    empty_string = [x.lower() if isinstance(x, str) else x for x in lfp]
    return empty_string

print(is_purple(1,2,"colors","Purple"))
# [1, 2, 'colors', 'purple']

isinstance(x, str)检查x是否为字符串。如果它返回一个True,我们就执行.lower(),否则就保留列表项的原样。你知道吗

相关问题 更多 >