此解决方案保留每行的最后一个非 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)]