扁平化列表列表,用特定值替换空子列表

Posted

技术标签:

【中文标题】扁平化列表列表,用特定值替换空子列表【英文标题】:Flattening a list of lists, replacing empty sublists with a certain value 【发布时间】:2020-03-31 13:57:45 【问题描述】:

我有一个列表列表,其中包含空子列表和非空子列表的混合。 列表总长度为240。

_remain = [['24'],
 ['24'],
 ['17'],
 [],
 ['17'],
 [],
 ['17'],...]

我已经尝试将列表列表扁平化为一个列表:

[name for sublist in _remain for name in sublist]

但是当我这样做时,我得到一个长度为 220 的列表。空的子列表消失了。

我的愿望是得到一个扁平列表,用np.nan 替换空列表,以便我可以将它插入熊猫DataFrame

我想得到的结果列表:

['24',
 '24',
 'np.nan',
 '17',
 'np.nan',
 '17',...]

我应该尝试什么?

【问题讨论】:

【参考方案1】:

您可以执行以下操作:

>>> [name for sublist in _remain for name in (sublist or [np.nan])]
['24', '17', nan, '17', nan, '17']

【讨论】:

【参考方案2】:

由于 pandas 被标记(尽管可以按照上述答案的建议使用 vanilla python 来完成),一种方法是:

pd.DataFrame(l).fillna(np.nan).squeeze().tolist()

['24', '17', nan, '17', nan, '17']

【讨论】:

【参考方案3】:

这是一种选择:

L = [
    ['24'],
    ['17'],
    [],
    ['17'],
    [],
    ['17']
]
L = np.array([l[0] if l else np.nan for l in L])

输出:

L >> ['24' '17' 'nan' '17' 'nan' '17']

【讨论】:

【参考方案4】:

你可以使用一个小的辅助函数:

lst = [[1], [], [2], [], [3]]

def func(x):
    try:
        return x[0]
    except IndexError:
        return None

[func(i) for i in lst]
# [1, None, 2, None, 3]

【讨论】:

【参考方案5】:

你可以用这个:

 flat_list = [item for sublist in l for item in sublist]

flat_list = []
for sublist in l:
    if len(sublist) == 0:
        flat_list.append(np.nan)
    else:
        for item in sublist:
            flat_list.append(item)

【讨论】:

它放了两个版本,一个处理nan,另一个不处理

以上是关于扁平化列表列表,用特定值替换空子列表的主要内容,如果未能解决你的问题,请参考以下文章

2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化

LeetCode 341 扁平化嵌套列表迭代器

使用 pandas json_normalize 扁平化包含多个嵌套列表的字典列表

扁平化(不规则)Python 中关于 Pandas Dataframes 的列表列表

Medium | LeetCode 341. 扁平化嵌套列表迭代器 | 递归 | 栈

为啥 itertools.chain 比扁平化列表理解更快?