Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中展平字符串列表和字符串列表_Python_List - Fatal编程技术网

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

在Python中展平字符串列表和字符串列表,python,list,Python,List,以前也曾提出过类似的问题,但这些问题的解决方案不适用于我的用例(例如,and)。我有一个字符串和列表列表,其中嵌入的列表也可以包含字符串和列表。我想将其转换为一个简单的字符串列表,而不将字符串拆分为字符列表 import itertools list_of_menuitems = ['image10', ['image00', 'image01'], ['image02', ['image03', 'image04']]] chain = itertools.chain(*list_of_me

以前也曾提出过类似的问题,但这些问题的解决方案不适用于我的用例(例如,and)。我有一个字符串和列表列表,其中嵌入的列表也可以包含字符串和列表。我想将其转换为一个简单的字符串列表,而不将字符串拆分为字符列表

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

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

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


在一种特殊情况下,如果列表项中没有一个包含以下分隔符之一
[]'
,则可以使用以下方法。我没有对其进行分析,但很明显,这将比明显且更干净的递归解决方案具有更好的性能

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

我同意,这是一个肮脏的黑客行为,但没有太多的努力就完成了这项工作。

这是一个通用的递归展平,可用于处理应展平或不应展平的任何类型组合:

import collections
def generic_flatten(seq, flatten_types=(tuple,list,set),atom_types=(basestring,dict),fixtype=True):
    newseq = []
    for item in seq:
        if (not isinstance(collections.Iterable)) or any(isinstance(i,t) for t in atom_types):
           newseq.append(item)
        elif any(isinstance(i,t) for t in flatten_types): # set flatten_types to (object,) or (collections.Iterable,) to disable check
           newseq.extend(generic_flatten(item, flatten_types, atom_types,fixtype)
    if fixtype and type(newseq) is not type(seq):
       newseq = type(seq)(newseq)
    return newseq
yield
chain
可用于创建基于迭代器的通用版本。

经常重复的函数只需简单修改即可应用于这种情况

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
将确保
str
unicode
对象均未拆分

还有一些版本依赖于
i
没有
\uuu iter\uuuu
属性。我不知道所有这些,因为我认为
str
现在有了这个属性。但是,值得一提的是

(请向上投票链接的答案。)

使用递归

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


请看:我同意这几乎是重复的。这个问题中缺少的一个维度(我在问我的问题之前没有发现)是任意嵌套级别的问题。然而,在那里发布的解决方案(和)至少在我提供的情况下,可以很好地处理这个问题。OP:使用
basestring
而不是
str
,这样就不会拆分
unicode
。这有一些冗余-isinstance考虑继承,并且可以将none测试切换到递归测试branch@marcin谢谢你的评论。我修改了我的代码为了解决这些问题。我喜欢这一点有多简单。在python 3.2中,我只需要用str替换basestring,它的工作方式完全符合我的要求。我会反对这一点,只是你清楚地解释了它的缺点。所以我想这是一个很好的参考。我确实怀疑,链接到那个答案会更好,这样会更好我认为这是一个方向,不会引入重复。
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']