如何将字典和单个项目的列表展平到应复制单个项目的列表中

问题描述

我有这个数组:

import numpy as np

array_start = [{'Very Ripe': 5},{'Ripe': 2},np.nan]

我想生成一个包含单个项的数组并复制np.nan值,以便最终得到这个数组:

>>> array_end
['Very Ripe',5,'Ripe',2,nan,nan]

到目前为止,我已经尝试了以下方法

>>> array_end = [item.items() if isinstance(item,dict) else np.repeat(np.nan,2) for item in array_start]
>>> array_end
[dict_items([('Very Ripe',5)]),dict_items([('Ripe',2)]),array([nan,nan])]

这使我迷失了方向,但是似乎更难解压缩dict_items中的np.nan和后一个数组(array_end个数组)以生成目标{{1 }}:

array_end

解决方法

是否必须在单个列表理解中?不要让简洁成为功能代码的敌人。

这是一种使用两个列表推导的方法:

array_end = [list(*item.items()) if isinstance(item,dict) else np.repeat(np.nan,2) for item in array_start]
print(array_end)
# Output: [['Very Ripe',5],['Ripe',2],array([nan,nan])]

在第一个列表理解中,我们将dict_items()对象解压缩到列表中。然后,我们有了一个列表列表(或numpy数组),可以对其进行另一种理解以使其变平。

array_final = [y for x in array_end for y in x]
print(array_final)
# Output: ['Very Ripe',5,'Ripe',2,nan,nan]
,

您可以遍历array_list中的每个项目,检查它是否是字典,并根据是否复制该项目而定,或者如果不是,则提取所有字典项目。您可以选择使用这两种方法之一

使用list.extend的简单循环:

import numpy as np

array_start = [{'Very Ripe': 5},{'Ripe': 2},np.nan]

result = []
for element in array_start:
    if isinstance(element,dict):
        for item in element.items():
            result.extend(item)
    else:
        result.extend((element,element))
print(result)
# ['Very Ripe',nan]

发电机功能:

def to_flat_list(array):
    for element in array:
        if isinstance(element,dict):
            for item in element.items():
                yield from item
        else:
            yield element
            yield element

            
result = list(to_flat_list(array_start))
print(result)
# ['Very Ripe',nan]

嵌套循环访问列表:

result = [item 
          for element in array_start
          for pair in (element.items() if isinstance(element,dict) 
                       else [(element,element)])
          for item in pair]
print(result)
# ['Very Ripe',nan]

itertools.chain.from_iterable

from itertools import chain

flatten = chain.from_iterable
result = list(flatten((flatten(item.items()) 
                       if isinstance(item,dict) 
                       else (item,item) 
                       for item in array_start)))
print(result)
# ['Very Ripe',nan]

以及其他一些方式。但是这些就足够了。