Python 中的混合类型列表推导式

Mixed type list comprehensions in Python

提问人:Callum Brown 提问时间:9/20/2023 更新时间:9/20/2023 访问量:60

问:

我试图在列表中过滤大于特定值的数字,同时保留列表中的任何字符串。

我喜欢在没有循环的情况下实现这一点,所以最好是列表理解。到目前为止,我有这个,我知道为什么它不起作用,但我不确定如何让它工作

my_list = [1, 2, 3, 'hello', 'world']
filtered_list = [x for x in my_list if (isinstance(x,str)) | ((isinstance(x,int))&(x>2))]

预期结果:

[3, 'hello', 'world']

实际结果:

TypeError: '>' not supported between instances of 'str' and 'int'
列表 列表推导式

评论

4赞 jonrsharpe 9/20/2023
第一件事:使用逻辑 (, ),而不是按位 (, ) 运算符。andor&|

答:

-1赞 Giba 9/20/2023 #1

尝试使用以下内容:

my_list = [1, 2, 3, 'hello', 'world']
threshold = 2

filtered_list = [x for x in my_list if isinstance(x, str) or (isinstance(x, int) and x > threshold)]

print(filtered_list)
1赞 LetzerWille 9/20/2023 #2
my_list = [1, 2, 3, 'hello', 'world']
filtered_list = [x for x in my_list if (isinstance(x,str)) or ((isinstance(x,int)) and (x>2))]
print(filtered_list)
[3, 'hello', 'world']
1赞 Luatic 9/20/2023 #3

作为列表推导:

[x for x in my_list if not isinstance(x, int) or x > 2]

读作:取所有不是整数或整数但大于 的 x 。我们利用短路,因此(字符串会出错)仅在为整数时才会被计算。2orx > 2x

您可能希望使用 isinstance(x, numbers.Number)来处理其他数字类型。

我还发现这非常可读:filter

list(filter(lambda x: not isinstance(x, int) or x > 2, my_list))

通常,您只需要一个迭代器,而不是一个新列表;那时你可以省去封闭。list


注意:您的示例仅包含字符串和整数;此解决方案保留每个非整数值,包括非字符串值。如果还需要筛选出其他类型,则可以将条件更改为 。同样,短路确保您只与 if 为整数进行比较。isinstance(x, str) or (isinstance(x, int) and x > 2)x2x

2赞 Guy 9/20/2023 #4

您需要使用逻辑运算符。您也可以使用isinstancenot

filtered_list = [x for x in my_list if not (isinstance(x, int) and x < 3)]
print(filtered_list) # [3, 'hello', 'world']
0赞 MyName 9/20/2023 #5

filtered_list = my_list[如果 type(x)==str 或 type(x)==int 和 x>2]