[英]Flatten a list of strings which contains sublists
I have a list
of strings
which contains a sublist
os strings
: 我有一个
strings
list
,其中包含一个sublist
os strings
:
ids = [u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', [u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
u'spotify:track:045sp2JToyTaaKyXkGejPy']]
I tried to flatten it with: 我试图用以下方法使其变平:
[item for item in ids for item in sublist]
and 和
chain = itertools.chain(ids)
but these solutions split the strings... 但是这些解决方案将字符串分开...
how do I flatten the original list
into 我如何将原始
list
拼合为
[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',u'spotify:track:045sp2JToyTaaKyXkGejPy']
? ?
You could use a simple loop with an isinstance
check. 您可以使用带有
isinstance
检查的简单循环。
out = []
for i in ids:
if isinstance(i, list):
out.extend(i)
else:
out.append(i)
print(out)
Output: 输出:
['spotify:track:3ftnDaaL02tMeOZBunIwls',
'spotify:track:4CKjTXDDWIrS0cwSA9scgk',
'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
'spotify:track:045sp2JToyTaaKyXkGejPy']
You could also use itertools.chain
, but with an extra layer of preprocessing: 您还可以使用
itertools.chain
,但要多加一层预处理:
from itertools import chain
out = list(chain.from_iterable([i if isinstance(i, list) else [i] for i in ids]))
print(out)
With the same output. 具有相同的输出。
You just have to cast any strings to lists: 您只需要将任何字符串强制转换为列表:
import itertools
ids = [u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', [u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
u'spotify:track:045sp2JToyTaaKyXkGejPy']]
new_data = list(itertools.chain.from_iterable([[i] if not isinstance(i, list) else i for i in b]))
Output: 输出:
[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F', u'spotify:track:045sp2JToyTaaKyXkGejPy']
You can make a function to flatten the list. 您可以创建一个使列表变平的功能。
def flatten(lst):
if isinstance(lst, (str, unicode)):
return [lst]
return [unit for item in lst for unit in flatten(item)]
print(flatten(ids))
You can do: 你可以做:
>>> [x for l in ids for x in (l if isinstance(l, list) else [l])]
[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F', u'spotify:track:045sp2JToyTaaKyXkGejPy']
Which is similar to your list comprehension of [item for item in ids for item in sublist]
but adding a test to see if it is actually a list we are looking at. 这与您的
[item for item in ids for item in sublist]
列表[item for item in ids for item in sublist]
的列表理解类似,但是添加了一个测试以查看它是否实际上是我们正在查看的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.