簡體   English   中英

展平包含子列表的字符串列表

[英]Flatten a list of strings which contains sublists

我有一個strings list ,其中包含一個sublist os strings

ids = [u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', [u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
u'spotify:track:045sp2JToyTaaKyXkGejPy']]

我試圖用以下方法使其變平:

[item for item in ids for item in sublist]

chain = itertools.chain(ids)

但是這些解決方案將字符串分開...

我如何將原始list拼合為

[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F',u'spotify:track:045sp2JToyTaaKyXkGejPy']

您可以使用帶有isinstance檢查的簡單循環。

out = []
for i in ids:
    if isinstance(i, list):
        out.extend(i)
    else:
        out.append(i)

print(out)  

輸出:

['spotify:track:3ftnDaaL02tMeOZBunIwls',
 'spotify:track:4CKjTXDDWIrS0cwSA9scgk',
 'spotify:track:6oRbm1KOqskLTFc1rvGi5F',
 'spotify:track:045sp2JToyTaaKyXkGejPy'] 

您還可以使用itertools.chain ,但要多加一層預處理:

from itertools import chain

out = list(chain.from_iterable([i if isinstance(i, list) else [i] for i in ids]))
print(out)    

具有相同的輸出。

您只需要將任何字符串強制轉換為列表:

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]))

輸出:

[u'spotify:track:3ftnDaaL02tMeOZBunIwls', u'spotify:track:4CKjTXDDWIrS0cwSA9scgk', u'spotify:track:6oRbm1KOqskLTFc1rvGi5F', u'spotify:track:045sp2JToyTaaKyXkGejPy']

您可以創建一個使列表變平的功能。

def flatten(lst):
  if isinstance(lst, (str, unicode)):
    return [lst]
  return [unit for item in lst for unit in flatten(item)]

print(flatten(ids))

你可以做:

>>> [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']

這與您的[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM