使用理解从 python 列表中提取子集
Extract subset from python list using comprehensions
我知道了。列表(这里展示的玩具示例):
rasters = ['A','A.txt','B','B.txt']
我想删除 .txt 文件,所以这样做:
ras = [x for x in enumerate(rasters) if len(os.path.splitext(x)[1]) > 0]
但是,我得到这个错误:*** AttributeError: 'tuple' object has no attribute 'rfind'
我该如何解决这个问题?
只需从您的列表理解中删除 enumerate
并在您的 if 语句中删除 not
ras = [x for x in rasters if not len(os.path.splitext(x)[1]) > 0]
enumerate
将为您提供栅格的(索引,值)列表,因为您只需要值。
也不需要检查 os.path.splitext(x)[1]
的长度,你可以简单地做
ras = [x for x in rasters if not os.path.splitext(x)[1]]
当与 if bool
一起使用时,os.path.splitext(x)[1]
的值将被认为对于 ''
字符串为假。
enumerate(rasters)
returns (index, element)
对列表。您将该列表的每个元素传递给 os.path.splitext
,它需要一个字符串。
您需要确保只将元素提供给 splitext
,而不是包含元素及其索引的元组。实际上,这意味着将第二个元素投影到元组之外:x[1]
.
你的情况也不对。您正在选择 带有 扩展名的元素,而不是那些 没有 的元素。将 > 0
更改为 == 0
.
ras = [x for x in enumerate(rasters) if len(os.path.splitext(x[1])[1]) == 0]
这是假设您打算保留原始列表中的项目索引。如果你不想那样,你不应该使用 enumerate
.
ras = [x for x in rasters if len(os.path.splitext(x)[1]) == 0]
我知道了。列表(这里展示的玩具示例):
rasters = ['A','A.txt','B','B.txt']
我想删除 .txt 文件,所以这样做:
ras = [x for x in enumerate(rasters) if len(os.path.splitext(x)[1]) > 0]
但是,我得到这个错误:*** AttributeError: 'tuple' object has no attribute 'rfind'
我该如何解决这个问题?
只需从您的列表理解中删除 enumerate
并在您的 if 语句中删除 not
ras = [x for x in rasters if not len(os.path.splitext(x)[1]) > 0]
enumerate
将为您提供栅格的(索引,值)列表,因为您只需要值。
也不需要检查 os.path.splitext(x)[1]
的长度,你可以简单地做
ras = [x for x in rasters if not os.path.splitext(x)[1]]
当与 if bool
一起使用时,os.path.splitext(x)[1]
的值将被认为对于 ''
字符串为假。
enumerate(rasters)
returns (index, element)
对列表。您将该列表的每个元素传递给 os.path.splitext
,它需要一个字符串。
您需要确保只将元素提供给 splitext
,而不是包含元素及其索引的元组。实际上,这意味着将第二个元素投影到元组之外:x[1]
.
你的情况也不对。您正在选择 带有 扩展名的元素,而不是那些 没有 的元素。将 > 0
更改为 == 0
.
ras = [x for x in enumerate(rasters) if len(os.path.splitext(x[1])[1]) == 0]
这是假设您打算保留原始列表中的项目索引。如果你不想那样,你不应该使用 enumerate
.
ras = [x for x in rasters if len(os.path.splitext(x)[1]) == 0]