在Python中展开字符串列表、字符串列表和列表

2024-04-24 23:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

以前也有类似的问题,但是这些问题的解决方案对我的用例不起作用(例如Making a flat list out of list of lists in PythonFlattening a shallow list in Python)。我有一个字符串和列表的列表,其中嵌入的列表也可以包含字符串和列表。我想把它变成一个简单的字符串列表,而不把字符串分成字符列表。

import itertools

list_of_menuitems = ['image10', ['image00', 'image01'], ['image02', ['image03', 'image04']]]
chain = itertools.chain(*list_of_menuitems)

结果列表:

['i', 'm', 'a', 'g', 'e', '1', '0', 'image00', 'image01', 'image02', ['image03', 'image04']]

预期结果:

['image10', 'image00', 'image01', 'image02', 'image03', 'image04']

做这个最好的方法是什么?


Tags: of字符串inchain列表解决方案listitertools
3条回答

以下适用于字符串(并且很容易适应其他类型):

def flatten_to_strings(listOfLists):
    """Flatten a list of (lists of (lists of strings)) for any level 
    of nesting"""
    result = []

    for i in listOfLists:
        # Only append if i is a basestring (superclass of string)
        if isinstance(i, basestring):
            result.append(i)
        # Otherwise call this function recursively
        else:
            result.extend(flatten_to_strings(i))
    return result

flatten_to_strings(list_of_menuitems)
Out[2]: ['image10', 'image00', 'image01', 'image02', 'image03', 'image04']

经常重复的^{}函数可以通过简单的修改应用于这种情况。

from collections import Iterable
def flatten(coll):
    for i in coll:
            if isinstance(i, Iterable) and not isinstance(i, basestring):
                for subc in flatten(i):
                    yield subc
            else:
                yield i

basestring将确保strunicode对象不被拆分。

也有依赖于i而没有__iter__属性的版本。我不知道这些,因为我认为str现在有了这个属性。但是,值得一提。

(请对链接的答案进行投票。)

使用递归。

def flatten(A):
    rt = []
    for i in A:
        if isinstance(i,list): rt.extend(flatten(i))
        else: rt.append(i)
    return rt

测试:

>>> list_of_menuitems = ['image10', ['image00', 'image01'], ['image02', ['image0
3', 'image04']]]
>>> flattern(list_of_menuitems)
['image10', 'image00', 'image01', 'image02', 'image03', 'image04']

相关问题 更多 >