当列表只有一个值时Python列表的长度

2024-05-23 18:29:22 发布

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

好吧,我承认我问得不太好。我会更新我的问题,使之更精确。

我正在编写一个函数,它以列表作为参数。我想检查一下列表的长度,这样我就可以遍历列表了。

我遇到的问题是,当列表只有一个条目时,len(myList)返回该条目的长度(字符串的长度),而不是应该等于1的列表的长度。

如果强制将参数解析为单个值列表['val'],我可以修复此问题。但我更希望我的API允许用户解析一个值或一个值列表。

示例:

    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']似乎没什么大不了的,但到目前为止它破坏了我的API的一致性。


Tags: 函数api列表data参数commentkwargslist
3条回答

您可以询问变量是否为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

第二个选项的好处是,它不仅可以作为第一个选项用于lists,还可以用于任何可iterable(strings、sets、dicts等)的对象

如果你想把字符串当作一个列表来处理,实际上你需要把它放到一个列表中

编辑

我看到在某个时刻,字符串前面有一个listlist与您的想法相反,它不会创建一个项的列表。它对string对象调用__iter__,并遍历每个项。因此它列出了一个字符列表。

希望这能更清楚地说明:

>>> print(list('abc'))
['a', 'b', 'c']
>>> print(list(('abc',)))
['abc']

由单个项组成的列表的正确python语法是[ 'ed' ]

使用list('ed')所做的是要求python将'ed'转换为列表。这在python中是一个一致的隐喻:当你想把某个东西转换成字符串时,你会说str(some_thing)。任何让list('ed')返回一个只有字符串“ed”的列表的方法都会破坏python的内部隐喻。

当python看到list(x)时,它将尝试将x转换为列表。如果x是iterable,它会做一些或多或少相当于这样的事情:

def make_list(x):
  ret_val = []
  for item in x:
    ret_val.append(item)
  return ret_val

因为字符串'ed'是iterable,python会将其转换为长度为2的列表:[ 'e', 'd' ]

在这种情况下,最干净的惯用python可能是让您的函数接受可变数量的参数,因此

def my_func(itemList):
  ...

你会这么做的

def my_func(*items):
  ...

而不是这样称呼

my_func(['ed','lu','lsky'])

你可以这样称呼它:

my_func('ed', 'lu', 'lsky')

通过这种方式,您可以接受任意数量的参数,并且您的API将是干净的。

相关问题 更多 >