Python 从列表中剥离空元素
我有这样一个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', '', '']},
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解决方案,所以我改变了它。我还认为,我通过标识要保留的列而不是要删除的列,使它更干净。