通过替换空值python将嵌套列表合并为一个列表



我有一个列表,里面有几个嵌套的列表,下面是示例:

temp_lst = [[None, None, None, None, None, None, None, '51', '51', '19'],
[None, None, None, '55', '55', '55', '55', None, None, None],
['23', '23', '55', None, None, None, None, None, None, None]]

我想把它合并到一个列表中,并且值应该按照特定的顺序,结果需要,就像这样

['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']

temp_lst中可能有更多列表。

您需要转置矩阵,然后筛选出可能的候选者。

arr=[[None, None, None, None, None, None, None, '51', '51', '19'],
[ None, None, None,'55', '55', '55', '55', None, None, None],
['23', '23', '55',None, None, None,None, None, None,None]]
ans=[]
for i in zip(*arr[::-1]):
ans.append(list(filter(lambda x:x is not None, i))[0])
print(ans)

试试这个:

new_list = [n for sublist in original_list for n in sublist if n != None]

基本上,我在这里所做的是使用列表综合。

您并没有真正使列表变平,而是从子列表中的每个位置获取非None的值。

您可以通过使用zip((和使用or来组合您的列表,以获得不是None(或''(您没有(的值:

# you keep the vaue on each position thats not None 
data =  [[None, None, None, None, None, None, None, '51', '51', '19'],
[None, None, None, '55', '55', '55', '55', None, None, None],
['23', '23', '55', None, None, None, None, None, None, None]]
# wanted ['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']
def coalesque(iterable, default):
"""Returns the first truthy value from iterable or default."""
for x in iterable:
if x: 
return x
return default
result = [ coalesque(n,'') for n in zip(*data)]  
print(result)

将输出:

['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']

只要你能确保:

  • 所有列表的长度相等(否则请研究itertools.zip_lengest(
  • 每个"列"只有一个元素不是None(只使用第一个(

如果一个"列"中的所有值都是错误的,则将default用于coalesque(iterable,default)来定义应返回的内容。

参见:

  • 真值测试
  • 用于大小不均列表的itertools.zip_lengest

您可以使用numpy来执行此操作。使用Numpy,您可以将任何尺寸的列表展平

import numpy as np
a  = [[None, None, None, None, None, None, None, '51', '51', '19'],
[ None, None, None,'55', '55', '55', '55', None, None, None],
['23', '23', '55',None, None, None,None, None, None,None]]
a = np.array(a) # Converting to numpy array
a = a.flatten() # Flatten a list with numpy's builtin function
a = [i for i in a if i != None] # Removing all occurences of None
a = list(a) # Converting back to python list

通过,这可以使的任何维度的列表变平

虽然其他人已经发布了一行代码,但如果列表中有更多层,这里有一个递归函数可以工作。

def unstack_list(temp_list):
# Construct list of elements to return
answer = []
for i in temp_list:
# if element of list is list, recurse and concatenate lists
if type(i) == list:
answer = unstack_list(i) + answer
# add to list if not None
elif i is not None:
answer.append(i)
return answer

此解决方案保留每行的最后一个非None值,并跳过显示所有None值的任何位置。

def crunchnones(data):
"""
Assumes data is an iterable containing lists of values, and
returns a single list of all non-None value in all lists in data,
maintaining their positions inside each list.
If no list contain a non-None value in a given position, that position
will be silently skipped.
If more than one list contains a non-None value in a given position,
only the one in the last list will be returned.
Example:
>>> data =  [[None, None, None, None, None, None, None, '51', '51', '19'],
[None, None, None, '55', '55', '55', '55', None, None, None],
['23', '23', '55', None, None, None, None, None, None, None]]
>>> data2 =  [[None, None, None, None, None, None, None, '51', None, '19'],
[None, None, None, '55', '55', '55', '55', None, None, None],
[None, '23', '55', None, None, None, None, None, None, None]]
>>> data3 =  [['21', None, None, None, None, None, None, '51', '51', '19'],
['22', None, None, '55', '55', '55', '55', None, None, None],
['23', '23', '55', None, None, None, None, None, None, None]]
>>>crunchnones(data)
['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']
>>>crunchnones(data2)
['23', '55', '55', '55', '55', '55', '51', '19']
>>>crunchnones(data3)
['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']
>>>
"""
#
temp = {}
for riga in data:
temp.update({i: x for i, x in enumerate(riga) if x is not None})
return [temp[i] for i in sorted(temp)]

最新更新