6

鉴于列表

a = [6, 3, 0, 0, 1, 0]

Python中返回列表的最佳方法是什么

b = [1, 1, 0, 0, 1, 0]

其中 b 中的 1 对应于 a 中的非零元素。我可以考虑运行一个 for 循环并简单地附加到 b 上,但我确信一定有更好的方法。

4

7 回答 7

11

列表理解方法:

a = [6, 3, 0, 0, 1, 0]
b = [1 if i else 0 for i in a]
print b
>>> 
[1, 1, 0, 0, 1, 0]

定时我的,Dave 的方法Lattyware 的轻微改动

$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[1 if i else 0 for i in a]"
1000000 loops, best of 3: 0.838 usec per loop
$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[int(i != 0) for i in a]"
100000 loops, best of 3: 2.15 usec per loop
$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[i != 0 for i in a]"
1000000 loops, best of 3: 0.794 usec per loop

看起来我的方法快了两倍……我真的很惊讶它的速度快得多。然而,取消int()调用使两者基本相同 - 但结果列表充满Booleans而不是Integers(True/False 而不是 1/0)

于 2013-05-27T14:33:11.007 回答
5
b = [int(i != 0) for i in a]

会给你你正在寻找的东西。

于 2013-05-27T14:33:29.067 回答
2

为了完整起见,并且由于没有其他人添加此答案:

b = map(bool, a)

但它返回布尔值而不是整数。

于 2013-05-27T15:37:33.120 回答
1

另一种方式

>>> a = [6, 3, 0, 0, 1, 0]

>>> [cmp(x,0) for x in a]
[1, 1, 0, 0, 1, 0]

请注意,cmp(x,0)负数返回 -1,因此您可能想abs要这样做。

于 2013-05-27T15:08:36.103 回答
1

您还可以根据您的应用程序使用 numpy 数组表示:

$ import numpy as np
$ a = [6, 3, 0, 0, 1, 0]
$ (np.array(a)!= 0).astype(int)
array([1, 1, 0, 0, 1, 0])

仅当您不想要布尔表示时才需要 astype(int)

于 2013-05-27T15:09:14.597 回答
1

怎么样

>>> a = [6, 3, 0, 0, 1, 0]

>>> [bool(x) for x in a]
[True, True, False, False, True, False]

>>> [int(bool(x)) for x in a]
[1, 1, 0, 0, 1, 0]

根据您的需要,布尔列表可能会更好。

于 2013-05-27T15:02:01.440 回答
0

更糟糕的是,另一种方式:

[{0: 0}.get (el, 1) for el in your_list]
于 2013-05-27T15:10:06.103 回答