下面给出了我:'int'对象没有属性'lower'。
我想将我创建的列表中的每个项目从传入的参数转换为小写。
我将元组转换为list,因为我对元组的理解无法更改 然后当我尝试小写时我得到了错误。
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()无法正常工作,我太傻了,看不到我在做什么错了:(
答案 0 :(得分:2)
因为,您的列表中没有字符串。只有字符串具有.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
是否为字符串。如果返回.lower()
,我们将执行True
,否则将保留列表项。
答案 1 :(得分:0)
您正在将多个值传递到is_purple
中,两个为int
类型,两个为string
类型。 lower()
是只能在字符串上调用的函数,因此,当您尝试在int
上调用该函数时会抛出错误。
在第二个示例中,您仅对.lower()
的对象调用string
,因此它确实起作用。
答案 2 :(得分:0)
@Travis
,您可以尝试以下操作:
>>> def is_purple(*lfp): return [i.lower() if type(i) is str else i for i in lfp]
...
>>> print(is_purple(1,2,"colors","Purple"))
[1, 2, 'colors', 'purple']
>>>
因此,您可以按如下所示更改代码(如果需要)以使其正常工作。
>>> def is_purple(*lfp):
... lower1 = [i for i in lfp]
... empty_string = [x.lower() if type(x) is str else x for x in lower1]
... return empty_string
...
>>> print(is_purple(1,2,"colors","Purple"))
[1, 2, 'colors', 'purple']
>>>
答案 3 :(得分:0)
您的问题源于您为is_purple
提供了一个整数和字符串列表的事实。更准确地说,在您的示例中(int,int,string,string)。
在这里我们可以看到1
的类型为int
,而"Purple"
的类型为字符串,这对于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
可能很大并且一次处理一个条目的情况下,生成器是最佳选择。
答案 4 :(得分:0)
如果您不想使用前两个参数,则只需在此处定义和使用它们,a=1
和b=2
和lfp
包含所有其他我认为是{ {1}},因此您无需检查它们是否为str类型并且可以直接使用。
str
您还可以删除中间列表并减少代码
def is_purple(a,b,*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"))
答案 5 :(得分:-1)
def is_purple(*lfp):
... lower1 = [i for i in lfp]
... empty_string = [x.lower() if type(x) is str else x for x in lower1]
... return empty_string
...
print(is_purple(1,2,"colors","Purple"))
[1, 2, 'colors', 'purple']