我有一个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!!!"
答案 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;例如。