我有n个列表的列表。每个内部列表包含(a)字符串,(b)空列表或(c)包含一个字符串的列表的组合。我想转换内部列表,以便它们只包含字符串。
我有一个这样的列表,例如:
[[[],["a"],"a"],[["ab"],[],"abc"]]
我希望它是这样的:
[["","a","a"],["ab","","abc"]]
我知道我可能会经历一个循环,但我正在寻找一个更优雅的解决方案,最好是列表理解。
答案 0 :(得分:1)
列表理解:
>>> original = [[[],["a"],"a"],[["ab"],[],"abc"]]
>>> result = [['' if not item else ''.join(item) for item in sublist] for sublist in original]
>>> result
[['', 'a', 'a'], ['ab', '', 'abc']]
答案 1 :(得分:1)
由于您想要展平的列表中的每个元素都是可迭代的,而不是检查某个类的实例(列表,字符串),您实际上可以使用duck-typing:
Boxa*
或更易阅读的版本:
>> my_list = [[[],["a"],"a"],[["ab"],[],"abc"]]
>> [list(map(lambda x: ''.join(x), elem)) for elem in my_list]
结果:
result = []
for elem in my_list:
flatten = map(lambda x: ''.join(x), elem)
result.append(list(flatten))
不检查什么是什么,而是利用转换机制来适应每个结构的自适应能力,这是相当pythonic。
答案 2 :(得分:0)
original_list = [[[],["a"],"a"],[["ab"],[],"abc"]]
flatten = lambda x: "" if x == [] else x[0] if isinstance(x, list) else x
flattened_list = [[flatten(i) for i in j] for j in original_list]
答案 3 :(得分:0)
通过列表理解:
lst = [[[],["a"],"a"],[["ab"],[],"abc"]]
result = [ ['' if not v else (v[0] if isinstance(v, list) else v) for v in sub_l]
for sub_l in lst ]
print(result)
输出:
[['', 'a', 'a'], ['ab', '', 'abc']]
答案 4 :(得分:0)
我不确定这是否是您想要的,但您可以尝试对原始列表中的每个列表使用递归解决方案。这是函数的代码。
def flatten(aList):
if aList == []:
return [""]
if type(aList[0]) is list:
return flatten(aList[0])+flatten(aList[1:]) if len(aList)>1 else flatten(aList[0])
return aList[:1]+flatten(aList[1:]) if len(aList)>1 else aList[:]