Python - 将具有不同大小的列表的数组转换为字符串

时间:2016-05-04 15:58:13

标签: python

我有一个Python数组,其中包含许多不同大小的列表。

myArray = [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')]

问题:获取波纹管输出的最佳方法(更优化)是什么,而不创建将每个值附加到字符串的循环方法?

我希望看到以下输出:

"Hello my name is Bond, James Bond. It is 16:40 now!!!"

6 个答案:

答案 0 :(得分:3)

首先,您必须将嵌套列表展平为“平面”列表。假设您的列表包含字符串或其他列表(或元组),您可以使用如下函数:

def flatten(lst):
    for x in lst:
        if isinstance(x, str):
            yield x
        else:
            for y in flatten(x):
                yield y

顺便说一下,在compiler.ast模块中似乎也有一个函数,所以您也可以导入该函数并使用它。但是,此模块已弃用,已在Python 3中删除。

from compiler.ast import flatten

无论哪种方式,在列表被展平后,您只需要将段加入一个字符串。

>>> list(flatten(myArray))
['Hello my name is ', 'Bond, James', 'Bond. It is ', '16:40', ' now', '!!!']
>>> ''.join(flatten(myArray))
'Hello my name is Bond, JamesBond. It is 16:40 now!!!'

答案 1 :(得分:2)

你可以编写一个非常全面的递归函数,就像我写的那样 -

In [1]: def solve(x):
            if isinstance(x, str):
                return x
            return ''.join(solve(y) for y in x)

In [2]: solve(myArray)
Out[2]: 'Hello my name is Bond, JamesBond. It is 16:40 now!!!'

答案 2 :(得分:2)

这是一种随着它变平而加入的变体:

def deepJoin(stuff,d = ' '):
    if isinstance(stuff,str):
        return stuff
    else:
        return d.join(deepJoin(x,d) for x in stuff)

例如:

>>> deepJoin( [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')])
'Hello my name is  Bond, James Bond. It is  16:40  now !!!'

答案 3 :(得分:2)

另一个选择是使用列表推导来展平列表:

bond_says = ["".join(item) for sublist in myArray for item in sublist] # list comprehension
print(" ".join(bond_says))

输出:

"Hello my name is  Bond, JamesBond. It is 16:40 now !!!"

答案 4 :(得分:1)

你可以使用正则表达式(python 2.7):

import re
myArray = [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')]
print re.sub("(?:^|')[^']+(?:'|$)", '',str(myArray))

[Output]

Hello my name is Bond, JamesBond. It is 16:40 now!!!

更新

尝试使用myArray = [('赢得了这个。#39;)] - tobias_k 7小时前

import re
p = r"(?:^|(?<!\\)')[^'\"\\]+(?:'|$)|(?:^|\")[^\"]+(?:\"|$)"

myArray = [('Hello my name is ', ('Bond, James', 'Bond. It is ', '16:40', ' now'), '!!!')]
myArray2= [('Won\'t work with this.')]

print (re.sub(p, '', str(myArray)))
print (re.sub(p, '', str(myArray2)))

[Output]

Hello my name is Bond, JamesBond. It is 16:40 now!!!
Won't work with this.

答案 5 :(得分:1)

map使其非常简洁:

def flatten(arr):
    if type(arr) == str:
        return arr.strip()
    else:
        return " ".join(map(flatten, arr))

返回&#34;你好我的名字是邦德,詹姆斯邦德。现在是16:40 !!!&#34;例如。