0

如何在 List Comprehension 中使用 python 类型?我可以吗?

>>> ll
[1, 2, 5, 'foo', 'baz', 'wert']

>>> [x for x in ll ]
[1, 2, 5, 'foo', 'baz', 'wert']

>>> [x for x in ll if type(x) == 'int']
[]

>>> [x*20.0 for x in ll if type(x) == 'int']
[]
>>> type(ll[0])
<type 'int'>

寻找 :[20, 40, 100, 'foo', 'baz', 'wert']

4

6 回答 6

2

你一般不会。改为使用isinstance()

于 2013-07-02T02:05:38.890 回答
2

试试看:

In [6]: [x * 20.0 if type(x) is int else x for x in ll]
Out[6]: [20.0, 40.0, 100.0, 'foo', 'baz', 'wert']

在这里,您使用 来检查类型type(x) is int,如果是,请相乘,否则您只需将 x 附加到结果列表 ( else x) 中,完全符合您的要求。

于 2013-07-02T08:22:53.443 回答
1

你应该使用 "is int" 而不是 "== 'int'"

[20*x if type(x) is int else x for x in ll]

于 2013-07-02T02:16:23.063 回答
1
>>> ll = [1, 2, 5, 'foo', 'baz', 'wert']
>>> [ x*20.0 if isinstance(x, int) else x for x in ll]
[20.0, 40.0, 100.0, 'foo', 'baz', 'wert']
于 2013-07-02T04:29:14.777 回答
1

通常,在 Python 中,最佳实践是使用“Duck Typing”。一种方法是使用异常处理,在这种情况下需要一个辅助函数:

def safe_multiply(x, y):
    try:
        return x * y
    except TypeError:
        return x

[safe_multiply(x, 20) for x in ll]

另一种鸭子类型的答案是查看对象是否具有乘法方法:

[x * 20 if hasattr(x, "__mul__") else x for x in ll]

但是上面两个都有一个怪癖:在 Python 中使用*字符串是合法的,结果重复字符串:

print("foo" * 3)  # prints "foofoofoo"

因此,最好的方法是使用 Ignacio Vazquez-Abrams 的答案。他实际上并没有给你代码,所以这里是:

[x * 20 if isinstance(x, int) else x for x in ll]
于 2013-07-02T02:57:07.427 回答
0

不要使用 == ,使用 'is' 你需要这样编写代码:

[x for x in ll if type(x) is 'int']
于 2013-07-02T04:20:00.113 回答