我有一个字符串和变量列表。例如:
['oz_', A, 'ab']
,其中A是一个列表,我不希望发生任何事情。
我想将其转换为:
['o','z','_', A, 'a', 'b']
A
是一个列表,所以我不想要任何改变它。我怎么能这样做?
答案 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)
为了将字符串列表转换为字符列表,我看到两种方法:
使用列表推导,每个字符串包含每个字符串:
>>> lst = ['oz_', 'A', 'ab']
>>> [char for string in lst for char in string]
['o', 'z', '_', 'A', 'a', 'b']
或join
字符串并将结果转换为列表:
>>> list(''.join(lst))
['o', 'z', '_', 'A', 'a', 'b']
如果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))