提问人:Callum Brown 提问时间:9/20/2023 更新时间:9/20/2023 访问量:60
Python 中的混合类型列表推导式
Mixed type list comprehensions in Python
问:
我试图在列表中过滤大于特定值的数字,同时保留列表中的任何字符串。
我喜欢在没有循环的情况下实现这一点,所以最好是列表理解。到目前为止,我有这个,我知道为什么它不起作用,但我不确定如何让它工作
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'
答:
-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 。我们利用短路,因此(字符串会出错)仅在为整数时才会被计算。2
or
x > 2
x
您可能希望使用 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)
x
2
x
2赞
Guy
9/20/2023
#4
您需要使用逻辑运算符。您也可以使用isinstance
not
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]
评论
and
or
&
|