Python列表只有一个值时的长度
好吧,我承认我提问的方式不太好。我会更新我的问题,让它更清楚。
我正在写一个函数,这个函数需要一个列表作为参数。我想检查这个列表的长度,这样我就可以遍历这个列表。
我遇到的问题是,当列表只有一个元素时,len(myList) 返回的是那个元素的长度(也就是字符串的长度),而不是列表的长度,列表的长度应该是1。
我可以通过强制参数作为单个值的列表 ['val'] 来解决这个问题。但我更希望我的接口能让用户传入一个值或者一个值的列表。
举个例子:
def myMethod(self,dataHandle, data,**kwargs):
comment = kwargs.get('comment','')
_dataHandle= list()
_data = list()
_dataHandle.append(dataHandle)
_data.append(data)
for i in range(_dataHandle):
# do stuff.
我希望能够通过以下方式调用我的方法:
myMethod('ed', ed.spectra,comment='down welling irradiance')
或者通过:
myMethod(['ed','lu'] , [ed.spectra,lu.spectra] , comments = ['downwelling', upwelling radiance'])
任何帮助都将非常感激。虽然看起来解析 ['ed'] 不是大问题,但这打破了我接口的一致性。
5 个回答
如果你想让你的字符串像列表一样被处理,实际上你需要把它放在一个 列表里。
编辑
我注意到在某个时候,字符串前面有一个 list
。其实,list
并不是像你想的那样只创建一个包含一个元素的列表。它会对字符串对象调用 __iter__
,然后逐个遍历每个字符。因此,它实际上是创建了一个字符的列表。
希望这样能让你更明白:
>>> print(list('abc'))
['a', 'b', 'c']
>>> print(list(('abc',)))
['abc']
如果你想创建一个只包含一个元素的列表,正确的写法是 [ 'ed' ]
。
你用 list('ed')
的方式,其实是在让 Python 把 'ed'
转换成一个列表。在 Python 中,这种转换的方式是很一致的:比如你想把某个东西变成字符串,就用 str(某个东西)
。如果你想用某种方法让 list('ed')
返回一个只包含字符串 'ed' 的列表,那样会破坏 Python 内部的逻辑。
当 Python 看到 list(x)
时,它会尝试把 x
转换成一个列表。如果 x
是可迭代的(也就是可以一个一个地取出元素),它会做一些类似下面的事情:
def make_list(x):
ret_val = []
for item in x:
ret_val.append(item)
return ret_val
因为你的字符串 'ed' 是可迭代的,所以 Python 会把它转换成一个长度为二的列表: [ 'e', 'd' ]
。
在这种情况下,最简洁的 Python 写法可能是让你的函数接受可变数量的参数,这样你就可以用下面的方式:
def my_func(itemList):
...
而不是这样:
def my_func(*items):
...
你可以这样调用它:
my_func(['ed','lu','lsky'])
这样你就可以接受任意数量的参数,你的接口会显得很整洁。
my_func('ed', 'lu', 'lsky')
你可以检查一下你的变量是不是一个 list
(列表):
def my_method(my_var):
if isinstance(my_var, list):
for my_elem in my_var:
# do stuff with my_elem
else: # my_var is not iterable
# do stuff with my_var
补充:另外一种方法是尝试遍历它,如果失败了(抛出异常),那么你就可以认为它是一个单一的元素:
def my_method(my_var):
try:
for my_elem in my_var:
# do stuff with my_elem
except TypeError: # my_var is not iterable
# do_stuff with my_var
这个第二种方法的好处是,它不仅适用于 list
,像第一种那样,还适用于任何可以被遍历的东西(比如 string
字符串、set
集合、dict
字典等等)。