列表中的Fatten列表(但不是其他iterables)

时间:2016-10-25 23:15:09

标签: python python-3.x

我有一个数据结构:

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]

如何最好地推导出我想要的输出?

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]