【发布时间】:2015-08-25 14:35:20
【问题描述】:
我有一个字符串和变量列表。例如:
['oz_', A, 'ab'],其中 A 是一个列表,我不希望它发生任何事情。
我想把它转换成:
['o','z','_', A, 'a', 'b']
A 是一个列表,所以我不想更改它。我该怎么做?
【问题讨论】:
-
该列表包含对对象的引用。仅给定列表,您无法判断这些引用是来自变量还是字符串文字。
我有一个字符串和变量列表。例如:
['oz_', A, 'ab'],其中 A 是一个列表,我不希望它发生任何事情。
我想把它转换成:
['o','z','_', A, 'a', 'b']
A 是一个列表,所以我不想更改它。我该怎么做?
【问题讨论】:
如果是字符串,您需要遍历每个元素并将其转换为列表,否则将其保留为变量并附加它。
source = ['oz_', A, 'ab']
result = []
for name in source:
if isinstance(name, str):
result += name
else:
result.append(name)
注意:如果您想考虑其他类型的字符串(如 unicode),请在 Python2.x 中使用 isinstance(name, basetring)。
【讨论】:
更新现在我们知道 A 不会被改变。
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)
输出:
['o', 'z', '_', [], 'a', 'b']
【讨论】:
强制单行:
>>> A = []
>>> seq = ['oz_', A, 'ab']
>>> [value for values in seq
... for value in (values if isinstance(values, str)
... else [values])]
['o', 'z', '_', [], 'a', 'b']
【讨论】:
为了将字符串列表转换为字符列表,我看到了两种方法:
要么使用列表推导式,从字面上包含每个字符串的每个字符:
>>> 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
【讨论】:
如果列表的完整元素是字符串,您可以使用 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 和普通字符串。
还请注意,上述方法不检查列表中的特定对象是否来自变量,它只是将字符串分解为字符,对于所有其他类型,它保持原样。
【讨论】:
>>> [a for a in ''.join(['oz_', 'A', 'ab'])]
['o', 'z', '_', 'A', 'a', 'b']
【讨论】:
A 保留为变量,而不是字符串。
A = [a for a in ''.join(['oz_', 'A', 'ab'])]
无论哪种方式,您都可以使用chain.from_iterable,您只需将非字符串包装在一个列表中:
from itertools import chain
out = list(chain.from_iterable([sub] if not isinstance(sub, str) else sub for sub in l))
【讨论】: