我有一个数据结构:
a = ['test', 32, ('tuple', 'example'), ['a', 'b', 2], ['c', 'd', 3]]
我想:
b = ['test', 32, ('tuple', 'example'), 'a', 'b', 2, 'c', 'd', 3]
我试过了:
c = [a[0], a[1], a[2], [l for l in a[3]], [j for j in a[4]]]
这导致c匹配a。我也尝试过:
c = [a[0], a[1], a[2], ''.join(str(l) for l in a[3]), ''.join(str(j) for j in a[4])]
> c
['test', 32, ('tuple', 'example'), 'ab2', 'cd3']
这导致连接使一切都成为一个字符串。我的加入将我的列表变为3项?似乎唯一的方法是指定子列表的每个索引,这是愚蠢的IMO。
c = [a[0], a[1], a[2], a[3][0], a[3][1], a[3][2], a[4][0], a[4][1], a[4][2]]
> c
['test', 32, ('tuple', 'example'), 'a', 'b', 2, 'c', 'd', 3]
如何最好地推导出我想要的输出?
答案 0 :(得分:3)
[i for e in a for i in (e if isinstance(e, list) else [e])]
演示:
>>> a = ['test', 32, ('tuple', 'example'), ['a', 'b', 2], ['c', 'd', 3]]
>>> [i for e in a for i in (e if isinstance(e, list) else [e])]
['test', 32, ('tuple', 'example'), 'a', 'b', 2, 'c', 'd', 3]
我们应该在这个理解中单独阅读2个:
[i
for e in a # first
for i in (e if isinstance(e, list) else [e])] # second
这种理解适用于2层for。第一个遍历原始列表a
,并提取每个元素并将其称为e
。
因为你需要的是展平所有list
s,我们需要另一层来进行展平,这将成为第二层。因为if-else部分处理2个场景:一个用于列表情况,一个用于其他情况。当它是一个列表时,你想要迭代它的内容,而对于其余的,你想保持它像这样,所以最简单的方法就是将元素包装在{{1创建一个单例。那么我们只需要逐个返回此处理列表中的任何内容,在这种情况下为list
。
答案 1 :(得分:1)
您可以使用它来对以下各种类型进行排序:
a = ['a',('tuple','example'),['b','c','d'],5]
newa = []
for x in a:
if type(x) is list:
for y in x:
newa.append(y)
else:
newa.append(x)
print(newa)
效率不高,但嘿,它有效。
修改强>: 你也可以用这个:
a = ['a',('tuple','example'),['b','c','d'],5]
newa = []
flattentypes = [list]
for x in a:
if type(x) in flattentypes:
for y in x:
newa.append(y)
else:
newa.append(x)
print(newa)
答案 2 :(得分:1)
可读性最强的方法可能是一个简单的for
循环,它扩展了列表项并将非列表项追加到新列表中:
a = ['test', 32, ('tuple', 'example'), ['a', 'b', 2], ['c', 'd', 3]]
ans = []
for item in a:
ans.extend(item) if isinstance(item,list) else ans.append(item)
# ans: ['test', 32, ('tuple', 'example'), 'a', 'b', 2, 'c', 'd', 3]