在Python中展平字符串列表和字符串列表

Ian*_*Gow 10 python list

类似的问题已经被问过,但这些解决方案不为我用的情况下工作(例如,制作一个平面列表出Python列表的列表压扁浅列表在Python,我已经是一个字符串列表和列表,其中嵌入列表也可以包含字符串和列表.我想将其转换为一个简单的字符串列表,而不将字符串拆分为字符列表.

import itertools

list_of_menuitems = ['image10', ['image00', 'image01'], ['image02', ['image03', 'image04']]]
chain = itertools.chain(*list_of_menuitems)
Run Code Online (Sandbox Code Playgroud)

结果清单:

['i', 'm', 'a', 'g', 'e', '1', '0', 'image00', 'image01', 'image02', ['image03', 'image04']]
Run Code Online (Sandbox Code Playgroud)

预期结果:

['image10', 'image00', 'image01', 'image02', 'image03', 'image04']
Run Code Online (Sandbox Code Playgroud)

什么是最好的(Pythonic)方法呢?

2rs*_*2ts 11

通过flatten简单的修改,可以将经常重复的函数应用于这种情况.

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
Run Code Online (Sandbox Code Playgroud)

basestring将确保两个strunicode对象不分裂.

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

(请关注相关答案.)


Ian*_*Gow 8

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

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']
Run Code Online (Sandbox Code Playgroud)

  • 这有一些冗余 - isinstance 考虑了继承,您可以将 none 测试切换到递归分支 (2认同)
  • 我喜欢这句话的简单直接。在 python 3.2 中,我只需要用 str 替换 basestring 即可,它完全按照我想要的方式工作。 (2认同)

rnb*_*guy 6

使用递归。

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

测试:

>>> list_of_menuitems = ['image10', ['image00', 'image01'], ['image02', ['image0
3', 'image04']]]
>>> flattern(list_of_menuitems)
['image10', 'image00', 'image01', 'image02', 'image03', 'image04']
Run Code Online (Sandbox Code Playgroud)


Abh*_*jit 5

在一种特殊情况下,当所有列表项都不包含以下分隔符之一时[]',您可以使用以下技巧。我没有对其进行分析,但很明显,这比明显且更清晰的递归解决方案具有更好的性能。

>>> str(list_of_menuitems).translate(None,"[]'").split(',')
['image10', ' image00', ' image01', ' image02', ' image03', ' image04']
Run Code Online (Sandbox Code Playgroud)

我同意,这是一个肮脏的黑客,但无需太多努力即可完成工作。