方法中使用单个字符串或字符串列表

13 投票
6 回答
10493 浏览
提问于 2025-04-17 04:42

我遇到过这个问题好几次了。我在处理很多可以接受字符串列表的方法。有几次我不小心传了一个单独的字符串,结果它被拆分成了一个列表,每个字符都被当成了一个元素,这样的结果并不是我想要的。

def test(a,b):
    x = []
    x.extend(a)
    x.extend(b)
    return x

x = [1,2,3,4]

我不想要发生的情况:

test(x,'test')
[1, 2, 3, 4, 't', 'e', 's', 't']

我不得不使用一种奇怪的语法:

test(x,['list']) 

我希望这些能自动工作:

test(x,'list')
[1, 2, 3, 4, 'test']

test(x,['one', 'two', 'three'])
[1, 2, 3, 4, 'one', 'two', 'three']

我真的觉得应该有一种“pythonic”的方式来处理这个问题,或者是和鸭子类型有关的东西,但我没有找到。我知道我可以用isinstance()来检查它是否是字符串,但我觉得还有更好的方法。

编辑:我使用的是python 2.4.3

6 个回答

9

很抱歉这样说,但这确实是少数几个使用 isinstance() 合理的情况之一。不过,有个其他的回答建议检查 list,这个方向是反的:str(在 Python 2.x 中还有 unicode)是特殊的类型,所以我们应该检查这些类型:

def test(a,b):
    x = []
    if isinstance(b, str): b = [b]
    x.extend(a)
    x.extend(b)
    return x

或者在 Python 2.x 中检查 isinstance(b, basestring)

13

使用这个

def test( x, *args ):

现在你可以这样做

test( x, 'one' )

还有

test( x, 'one', 'two' )

以及

test( x, *['one', 'two',] )
2

嗯,这可能是个简单的方法:

>>> def a(*args):
...     x=[]
...     for i in args:
...             if '__iter__' in dir(i):
...                     x+=list(i)
...             else:
...                     x.append(i)
...     return x
... 
>>> a(1,2,3,4)
[1, 2, 3, 4]
>>> a(1,2,[3,4])
[1, 2, 3, 4]
>>> a(1,2,[3,4],'123')
[1, 2, 3, 4, '123']
>>> a(1,2,[3,4],'123', 1231, (1, 2, 3, 4))
[1, 2, 3, 4, '123', 1231, 1, 2, 3, 4]

撰写回答