.lower()用于列表中的x,不起作用,但在另一种情况下起作用

时间:2018-11-02 18:35:43

标签: python string python-3.x

下面给出了我:'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()无法正常工作,我太傻了,看不到我在做什么错了:(

6 个答案:

答案 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=1b=2lfp包含所有其他我认为是{ {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']