将字符串和列表列表转换为字符和列表列表?

时间:2015-08-25 14:35:20

标签: python list split

我有一个字符串和变量列表。例如:

['oz_', A, 'ab'],其中A是一个列表,我不希望发生任何事情。

我想将其转换为:

['o','z','_', A, 'a', 'b']

A是一个列表,所以我不想要任何改变它。我怎么能这样做?

7 个答案:

答案 0 :(得分:4)

已更新,因为我们知道A不会被更改。

./configure --x-libraries

输出:

A = []
seq = ['oz_', A, 'ab']

res = []
for elt in seq:
    if isinstance(elt, str):
        for e in list(elt):
            res.append(e)
    else:
        res.append(elt)
print(res)

答案 1 :(得分:4)

如果它是一个字符串,你需要遍历每个元素并将其转换成一个列表,否则将其保留为变量并附加它。

source = ['oz_', A, 'ab']
result = []

for name in source:
    if isinstance(name, str):
        result += name
    else:
        result.append(name)

注意:如果您想要考虑其他类型的字符串,例如unicode,请使用isinstance(name, basetring) for Python2.x。

答案 2 :(得分:3)

如果列表的完整元素是字符串,您可以使用itertools.chain.from_iterable(),它需要一个可迭代的(如列表/元组等),然后对于其中的每个可迭代元素,它创建一个由那些内部迭代的元素(在这种情况下是字符串)。示例 -

In [5]: lst = ['oz_', 'A', 'ab']

In [6]: list(chain.from_iterable(lst))
Out[6]: ['o', 'z', '_', 'A', 'a', 'b']

如更新后的问题所示 -

  

A是一个列表,所以我不想要任何改变它。

你可以这样做(类似于@SuperBiasedMan所建议的)(对于Python 3.x) -

In [14]: lst = ['oz_', 'A', 'ab',[1,2,3]]

In [15]: ret = []

In [18]: for i in lst:
   ....:     if isinstance(i, str):
   ....:         ret.extend(i)
   ....:     else:
   ....:         ret.append(i)
   ....:

In [19]: ret
Out[19]: ['o', 'z', '_', 'A', 'a', 'b', [1, 2, 3]]

您可以在Python 2.x中使用basestring来同时考虑unicode和普通字符串。

请注意,上面的方法不检查列表中的特定对象是否来自变量,它只是将字符串分解为字符,而对于所有其他类型,它保持原样。

答案 3 :(得分:3)

为了将字符串列表转换为字符列表,我看到两种方法:

  1. 使用列表推导,每个字符串包含每个字符串:

    >>> lst = ['oz_', 'A', 'ab']
    >>> [char for string in lst for char in string]
    ['o', 'z', '_', 'A', 'a', 'b']
    
  2. join字符串并将结果转换为列表:

    >>> list(''.join(lst))
    ['o', 'z', '_', 'A', 'a', 'b']
    
  3. 如果A是一个变量而你想要保留它,事情会变得更加棘手。如果A是一个字符串,那么这是不可能的,因为A将被评估,然后与其他字符串无法区分。如果它是其他东西,那么你将必须区分这两种类型:

    >>> joined = []
    >>> for x in lst:
    ...     joined += x if isinstance(x, str) else [x] # +x extends, +[x] appends
    

答案 4 :(得分:3)

强制性单行:

>>> A = []
>>> seq = ['oz_', A, 'ab']

>>> [value for values in seq
...  for value in (values if isinstance(values, str)
...                else [values])]
['o', 'z', '_', [], 'a', 'b']

答案 5 :(得分:0)

>>> [a for a in ''.join(['oz_', 'A', 'ab'])]
['o', 'z', '_', 'A', 'a', 'b']

答案 6 :(得分:0)

您可以使用chain.from_iterable两种方式,只需要将非字符串包装在列表中:

from itertools import chain

out = list(chain.from_iterable([sub] if not isinstance(sub, str) else sub for sub in l))