Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中剥离空元素_Python_List_For Loop - Fatal编程技术网

Python 从列表中剥离空元素

Python 从列表中剥离空元素,python,list,for-loop,Python,List,For Loop,我有这样一个python数据结构 dl= [{'plat': 'unix', 'val':['', '', '1ju', '', '', '202', '', '']}, {'plat': 'Ios', 'val':['', '', '', '', 'Ty', '', 'Jk', '']}, {'plat': 'NT', 'val':['', '', 1, '', '' , '202', '', '']},

我有这样一个python数据结构

dl= [{'plat': 'unix',   'val':['', '',   '1ju', '', '',   '202', '',   '']},
     {'plat': 'Ios',    'val':['', '',   '',    '', 'Ty', '',    'Jk', '']},
     {'plat': 'NT',     'val':['', '',   1,     '', '' ,  '202', '',   '']},
     {'plat': 'centOs', 'val':['', '',   '',    '', '',   '202', '',   '']},
     {'plat': 'ubuntu', 'val':['', 'KL', '1',   '', '',   '',    '',   '9i0']}]
                                ^                ^
                                |                |
                                \                /
                                   Delete these 
我试图删除列表中的位置,其中每个列表中相同列中的值为空。例如,列表中的位置0和3(dl)。我试图得到如下输出:

Output= [{'plat': 'unix',   'val':['',   '1ju', '',   '202', '',   '']},
         {'plat': 'Ios',    'val':['',   '',    'Ty', '',    'Jk', '']},
         {'plat': 'NT',     'val':['',   1,     '' ,  '202', '',   '']},
         {'plat': 'centOs', 'val':['',   '',    '',   '202', '',   '']},
         {'plat': 'ubuntu', 'val':['KL', '1',   '',   '',    '',   '9i0']}]

让我们分两步来做。首先,查找要删除的索引:

lists = [e['val'] for e in dl]
idx_to_remove = [i for i, elem in enumerate(map(any, zip(*lists))) if not elem]
其次,让我们过滤原始列表:

for l in lists:
    l[:] = [elem for i, elem in enumerate(l) if i not in idx_to_remove]
结果:

>>> pprint.pprint(dl)
[{'plat': 'unix', 'val': ['', '1ju', '', '202', '', '']},
 {'plat': 'Ios', 'val': ['', '', 'Ty', '', 'Jk', '']},
 {'plat': 'NT', 'val': ['', 1, '', '202', '', '']},
 {'plat': 'centOs', 'val': ['', '', '', '202', '', '']},
 {'plat': 'ubuntu', 'val': ['KL', '1', '', '', '', '9i0']}]

让我们分两步来做。首先,查找要删除的索引:

lists = [e['val'] for e in dl]
idx_to_remove = [i for i, elem in enumerate(map(any, zip(*lists))) if not elem]
其次,让我们过滤原始列表:

for l in lists:
    l[:] = [elem for i, elem in enumerate(l) if i not in idx_to_remove]
结果:

>>> pprint.pprint(dl)
[{'plat': 'unix', 'val': ['', '1ju', '', '202', '', '']},
 {'plat': 'Ios', 'val': ['', '', 'Ty', '', 'Jk', '']},
 {'plat': 'NT', 'val': ['', 1, '', '202', '', '']},
 {'plat': 'centOs', 'val': ['', '', '', '202', '', '']},
 {'plat': 'ubuntu', 'val': ['KL', '1', '', '', '', '9i0']}]

另一个可能的解决方案(不是很有效,但很好…)
zip()
被低估了

# extract the values as a list of list
vals = [item["val"] for item in dl]
# transpose lines to columns
cols = map(list, zip(*lines))
# filter out empty columns
cols = [c for c in cols if filter(None, c)]
# retranspose columns to lines
lines = map(list, zip(*cols))
# build the new dict
output = [
    dict(plat=item["plat"], val=line) for item, line in zip(dl, lines)
    ]

另一个可能的解决方案(不是很有效,但很好…)
zip()
被低估了

# extract the values as a list of list
vals = [item["val"] for item in dl]
# transpose lines to columns
cols = map(list, zip(*lines))
# filter out empty columns
cols = [c for c in cols if filter(None, c)]
# retranspose columns to lines
lines = map(list, zip(*cols))
# build the new dict
output = [
    dict(plat=item["plat"], val=line) for item, line in zip(dl, lines)
    ]

是否要删除所有空元素?请尝试使示例更简单。为什么您的代码示例包括
'plat':'unix'
?我也不清楚“列表(dl)中的位置0和3”是什么意思:在输出列表中,您更改了所有位置。要删除元素在所有列表中为空的位置,如位置0在所有5个列表中为空('val'))@Tyle RandFriends我认为他想将多个连续空格
'
删除为单个
'
不清楚在您的示例中,将输入与输出关联起来的算法是什么。是否要删除所有空元素?请尝试使示例更简单。为什么您的代码示例包括
'plat':'unix'
?我也不清楚“列表(dl)中的位置0和3”是什么意思:在输出列表中,您更改了所有位置。要删除元素在所有列表中为空的位置,如位置0在所有5个列表中为空('val'))@TylerAndFriends我认为他想将多个连续空格
'
删除为单个
'
在您的示例中,不清楚将输入与输出关联的算法是什么。删除
0
索引后,
del item['val'][3]
实际上会删除第5个元素,而不是第4个元素,正如我们所希望的那样。@RomanBodnarchuk--谢谢。一定是有点睡着了。反正我不喜欢那部分。我把它改成了一个列表。当然,我想我们可以使用StevenRumvalski使用的反向迭代和pop解决方案——或者,我可以对remove_idx进行排序,使其降序。。。但是列表比较好。@mgilson:我不喜欢pop解决方案,所以我改变了它。我还认为,我通过标识要保留的列而不是要删除的列,使它更干净。在删除
0
索引后,
delitem['val'][3]
实际上会删除第5个元素,而不是我们希望的第4个元素。@RomanBodnarchuk--谢谢。一定是有点睡着了。反正我不喜欢那部分。我把它改成了一个列表。当然,我想我们可以使用StevenRumvalski使用的反向迭代和pop解决方案——或者,我可以对remove_idx进行排序,使其降序。。。但是列表比较好。@mgilson:我不喜欢pop解决方案,所以我改变了它。我还认为,我通过标识要保留的列而不是要删除的列,使它更干净。