假设我有一个清单x:
x=['alfa[1]', 'bravo', ('charlie[7]', 'delta[2]'), 'echo[3]']
我想创建一个新列表,如果该项目有一个,它会展平并删除括号中的数字。结果应该是:
x_flattened_bases = ['alfa', 'bravo', 'charlie', 'delta', 'echo']
以下是我目前的情况:
x_flattened_bases = []
for item in x:
if isinstance(item, tuple):
x_flattened_bases.extend([value.split('[')[0] for value in item)
else:
x_flattened_bases.append(item.split('[')[0])
列表中只有一级嵌套。
答案 0 :(得分:4)
这样的事情:
import collections
import re
def solve(lis):
for element in lis:
if isinstance(element, collections.Iterable) and not isinstance(element,str):
for x in solve(element):
yield re.sub(r"\[\d+\]",r"",x)
else:
yield re.sub(r"\[\d+\]",r"",element)
x=['alfa[1]', 'bravo', ('charlie[7]', 'delta[2]'), 'echo[3]']
print list(solve(x))
<强>输出:强>
['alfa', 'bravo', 'charlie', 'delta', 'echo']
答案 1 :(得分:3)
展平questions have been answered many times。
tl; dr 使用可怕的文档ast模块的展平功能
>>> from compiler.ast import flatten
>>> flatten([1,2,['dflkjasdf','ok'],'ok'])
[1, 2, 'dflkjasdf', 'ok', 'ok']
也会剥离[]的单行(假设所有子节点都是字符串):
>>> from compiler.ast import flatten
>>>def flattenstrip(input): return [el[:el.find('[')] if el.find('[')!=-1 else el for el in flatten(input)]
>>>flattenstrip(['alfa[1]', 'bravo', ('charlie[7]', 'delta[2]'), 'echo[3]'])
>>>['alfa', 'bravo', 'charlie', 'delta', 'echo']
答案 2 :(得分:2)
这是有效的,但它对结构做了很多假设(即只有一个嵌套级别,string
只有...)
from itertools import chain
lst = ['alfa[1]', 'bravo', ('charlie[7]', 'delta[2]'), 'echo[3]']
flattened = chain.from_iterable([x] if isinstance(x, str) else x for x in lst)
result = [x.rsplit('[', 1)[0] for x in flattened]
当您为焦点操作命名时,它会变得更整洁:
def flatten(it):
return chain.from_iterable([x] if isinstance(x, str) else x for x in lst)
def clean(it):
return (x.rsplit('[', 1)[0] for x in it)
result = list(clean(flatten(lst)))
如果你想更接近你拥有的代码,可以使用递归来清理它。
def process(lst, result=None):
if result is None:
result = []
for item in lst:
if isinstance(item, str):
result.append(item.rsplit('[', 1)[0])
else:
process(item, result)
return result
result = process(lst)
修改强>
更多简洁归功于来自@yoonkwon的灵感,但请注意{3}已弃用,不再存在于Python 3中:
compiler.ast
答案 3 :(得分:0)