我有一个列表,里面有几个嵌套的列表,下面是示例:
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)]