将python列表中的所有数字转换为1或0

时间:2013-07-22 12:51:30

标签: python

我有一个整数列表,它看起来像这样:

[10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]

我需要这个列表,每0,它保持0,每个更高的数字为1。 因此将上面的列表转换为:

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1]

我尝试使用以下代码:

for numbers in list:
   if number==0:
      number=0
   if number>1:
      number=1

然而这给了我:

 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

7 个答案:

答案 0 :(得分:12)

>>> l = [10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]
>>> [1 if x > 0 else 0 for x in l]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1]

如果您想更改现有列表

for i, x in enumerate(l):
    if x >= 1: l[i] = 1

答案 1 :(得分:11)

一个简单的列表理解

>>> l = [10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]
>>> [1 if i else 0 for i in l]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1]

您的代码无法正常工作的原因是您正在遍历(循环)列表中的每个项目,但不修改原始列表中的项目,只修改返回的项目。


计时器(按速度顺序):

# my method: [1 if i else 0 for i in l]
>>> timeit.Timer('[1 if i else 0 for i in l]', setup='from __main__ import l').repeat()
[1.4960370266417915, 1.457976119063474, 1.457053021255831]
# Roman Pekar: [1 if x > 0 else 0 for x in l]
>>> timeit.Timer('[1 if x > 0 else 0 for x in l]', setup='from __main__ import l').repeat()
[1.5296303022631434, 1.5041486202146075, 1.51295106957906]
# inspectorG4dget: [int(i>0) for i in myList]
>>> timeit.Timer('[int(i>0) for i in l]', setup='from __main__ import l').repeat()
[5.0810576000558285, 4.865218180917736, 4.7859557786252935]
# Haidro: map(int, map(bool, l))
>>> timeit.Timer('map(int, map(bool, l))', setup='from __main__ import l').repeat()
[5.725813168085608, 5.759308116913473, 5.549817013103507]
# alecxe: map(lambda x: int(x > 0), l)
>>> timeit.Timer('map(lambda x: int(x > 0), l)', setup='from __main__ import l').repeat()
[7.054628605392196, 7.291914272244128, 7.223923128993391]
# inspectorG4dget: [int(bool(i)) for i in l]
>>> timeit.Timer('[int(bool(i)) for i in l]', setup='from __main__ import l').repeat()
[8.60473766374804, 8.537255398342722, 8.545150893104449]

答案 2 :(得分:8)

myList = [10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]
newList = [int(i>0) for i in myList]

OR

newList = [int(bool(i)) for i in myList]

答案 3 :(得分:2)

您可以使用map代替列表理解方法:

>>> l = [10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]
>>> map(lambda x: int(x > 0), l)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1]

另见:Python List Comprehension Vs. Map

答案 4 :(得分:1)

您在创建numbers循环时使用for变量,但之后您正在比较number(没有')变量。

另外,请避免使用list作为列表名称;给它一些其他名称(例如a_list,或描述性的东西)。

其他人已经为您提供了很好的答案。如果您很难理解list comprehensions,那么这就是您尝试做的事情:

old_list = [1, 5, 0, 0, 2]
new_list = []
for each_element in old_list:
    if each_element == 0:
        new_list.append(0)
    else:
        new_list.append(1) # what about negative numbers?

这相当于:

new_list = [0 if each_element == 0 else 1 for each_element in a_list]

您还可以动态“修改”(覆盖)现有列表:

a_list = [0 if each_element == 0 else 1 for each_element in a_list]

答案 5 :(得分:1)

使用地图:

L = [10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]
print map(int, map(bool, L))

布尔值是整数的子类,因此False == 0True == 1。在bool上调用int()将分别返回1或0表示true或false。

请注意,在Python 3中,map返回一个迭代器。因此,您应该在外部list()

上致电map()

答案 6 :(得分:0)

这个怎么样:

nums = [10, 8, 4, 4, 13, 1, 1, 1, 1, 6, 1, 2, 1, 1, 0, 1, 5, 1, 5, 5, 2, 1, 0, 0, 4]
for i in range(len(nums)):
    if nums[i]: nums[i] = 1