【问题标题】:String of list or strings to a tuple列表的字符串或元组的字符串
【发布时间】:2013-09-04 13:44:53
【问题描述】:

我有一个类属性,它可以是字符串或字符串列表。我想将其转换为元组,以便列表正常转换,但单个字符串变为单项元组:

[str, str] --> (str, str)

str --> (str, )

不幸的是 tuple('sting') 返回 ('s', 't', 'r', 'i', 'n', 'g') 这不是我所期望的。不做类型检查可以吗?

【问题讨论】:

  • 您要求根据值的类型执行某些操作。根据定义,这需要某种形式的类型检查。

标签: python string iterable


【解决方案1】:

类型检查将是实现这一目标的好方法。否则,您将如何确定输入是列表还是字符串?

您可以创建一个函数来测试输入是列表还是字符串,然后适当地返回并根据您认为合适的方式处理其余部分。类似于

>>> def convert_to_tuple(elem):
        if isinstance(elem, list):
            return tuple(elem)
        elif isinstance(elem, basestring):
            return (elem,)
        else:
            # Do Something
            pass


>>> convert_to_tuple('abc')
('abc',)
>>> convert_to_tuple(['abc', 'def'])
('abc', 'def')

您也只能检查字符串,(假设 Python 2.x,在 Py3 中将 basestring 替换为 str

>>> def convert_to_tuple(elem):
        if isinstance(elem, basestring):
            return (elem,)
        else:
            return tuple(elem)


>>> convert_to_tuple('abc')
('abc',)
>>> convert_to_tuple(('abc', 'def'))
('abc', 'def')
>>> convert_to_tuple(['abc', 'def'])
('abc', 'def')

也可以将函数转换为单行。

>>> def convert_to_tuple(elem):
        return (elem,) if isinstance(elem, basestring) else tuple(elem)

【讨论】:

  • 他们要求一种没有类型检查的方法,所以我假设他们已经知道如何做到这一点?
  • AFAIK 类型检查将是实现这一目标的最佳方式。 :)
  • 谢谢。我只是想知道是否还有其他方法,因为类型检查(正确地)被认为是不优雅的。
【解决方案2】:

你可以这样做:

>>> s = 'str'
>>> print (s,)
('str',)

在处理字符串时无需调用tuple() 即可实现您的目标。

如果您需要一种方法来帮助两种类型,那么您就无法避免类型检查:

def tuplising(typ):
    return tuple(typ) if isinstance(typ, list) else (typ,)

【讨论】:

  • 是的,但是将您的提议应用于列表将返回 (['abc', 'cde'], ) 我需要 `('abc', 'cde')。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2017-08-29
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多