列表具有单个值时的Python列表长度

Cau*_*tic 0 python list

好吧,我承认我没有很好地提出这个问题.我会更新我的问题更准确.

我正在编写一个以列表作为参数的函数.我想检查列表的长度,以便我可以遍历列表.

我遇到的问题是当列表只有一个条目时,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.
Run Code Online (Sandbox Code Playgroud)

我希望能够通过调用我的方法

myMethod('ed', ed.spectra,comment='down welling irradiance')
Run Code Online (Sandbox Code Playgroud)

或者

myMethod(['ed','lu'] , [ed.spectra,lu.spectra] , comments = ['downwelling', upwelling radiance'])
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.解析['ed']似乎不是什么大不了的事,但它到目前为止打破了我的API的一致性.

Ben*_*son 5

包含单个项目的列表的正确python语法是[ 'ed' ].

你正在做的list('ed')是要求python转换'ed'为列表.这是python中的一致隐喻:当你想将某些东西转换为字符串时,你会说str(some_thing).任何你用来list('ed')返回一个只有字符串'ed'的列表的hack 都会破坏python的内部隐喻.

当python看到时list(x),它会尝试转换x为列表.如果x是可迭代的,它会或多或少地与此相同:

def make_list(x):
  ret_val = []
  for item in x:
    ret_val.append(item)
  return ret_val
Run Code Online (Sandbox Code Playgroud)

因为你的字符串'ed'是可迭代的,所以python会将它转换为长度为2的列表:[ 'e', 'd' ].

在这种情况下,最干净的惯用python可能是让你的函数接受可变数量的参数,所以不要这样做

def my_func(itemList):
  ...
Run Code Online (Sandbox Code Playgroud)

你会这样做的

def my_func(*items):
  ...
Run Code Online (Sandbox Code Playgroud)

而不是像这样称呼它

my_func(['ed','lu','lsky'])
Run Code Online (Sandbox Code Playgroud)

你这样称呼它:

my_func('ed', 'lu', 'lsky')
Run Code Online (Sandbox Code Playgroud)

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