问题描述
我有这个数组:
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]
以及其他一些方式。但是这些就足够了。