使用理解从python列表中提取子集

时间:2015-10-20 15:52:53

标签: python list list-comprehension

我有这个人。列表(这里介绍的玩具示例):

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'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

只需从列表理解中删除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]]

如果bool os.path.splitext(x)[1]的{​​{1}}值将被视为''字符串将被视为错误。

答案 1 :(得分:1)

enumerate(rasters)会返回(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]