python - Python双重列表理解
问题描述
我有一个从需要转换为二维数组的文件中读取的字符串列表:
IN >> lines = ['0.1;0;0;0;', '0.2;0;0;0;', '0.3;1;1;1;', '0.4;2;2;2;', '0.5;0;0;0;']
# Goes on for a few thousand lines
注意每个字符串以;
.
我需要排除全为零的行(有些行在开头和结尾都是零)
我.split()
打开;
但filter
None
要删除我将在每个返回数组的末尾从.split()
.
data_array = [list(filter(None, line.split(';'))) for line in lines if line.split(';')[1] != '0']
OUT >> data_array = [[0.1, 0, 0, 0], [0.2, 0, 0, 0], [0.3, 1, 1, 1], [0.4, 2, 2, 2], [0.5, 0, 0, 0]]
这是返回我需要的二维数组,但包括全零的数组,所以我的条件必须在错误的位置。除了我认为列表理解末尾的条件过滤了进入列表的元素。
然后我想我需要过滤“内部”数组:
data_array = [[l for l in (filter(None, line.split(';'))) if l != '0'] for line in lines]
OUT >> data_array = [[0.1], [0.2], [0.3, 1, 1, 1], [0.4, 2, 2, 2], [0.5]]
除了这是删除零但留下标记(每个数组的第一个元素是标记)
我想要得到的只是包含数字但不包含零的数组
DESIRED OUTPUT >> data_array = [[0.3, 1, 1, 1], [0.4, 2, 2, 2]]
解决方案
在多行上执行此操作而不使用filter(None, ...)
您可以使用的line[:-1]
, 来发出最后一个字符会更干净。首先在列表中创建列表,可以通过以下方式完成:
nested_list = [line[:-1].split(';') for line in lines]
然后,您可以遍历内部列表以检查它们是否包含 0:
filtered_list = [line for line in nested_list if '0' not in line]
然后我们需要将所有内容都转换为浮点数:
result = [list(map(float, line)) for line in filtered_list]
或者,如果您真的想要单线:
result = [list(map(float, line)) for line in [line[:-1].split(';') for line in lines] if '0' not in line]
推荐阅读
- php - 如何使用这种格式的 PHP 在 JSON 中添加新数组?
- python - 创建此 python 脚本以添加 100 个成员,但仅添加 3 到 5 并自动停止
- javascript - Javascript:未捕获的 ReferenceError:未定义 tb
- azure - 从 Azure 运行时模块到外部网关的 HTTP POST 请求
- java - 使用 ByteBuddy 重新定义特定实例
- jenkins - 如何在声明性管道中的 Jenkinsfile 中跨阶段存储和取消存储人工制品
- git - 在 github 上授予协作者管理员权限
- bash - 杀死mac终端后运行appium-doctor不会显示之前设置的env变量
- python - 使用 xml.etree 解析 Python xml
- gstreamer - 通过 udp 流式传输网络摄像头卡住