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

将python列表中的所有数字转换为1或0,python,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 nu

我有一个整数列表,如下所示:

[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]
如果要更改现有列表

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

您可以使用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]
另请参见:

创建for循环时使用的是numbers变量,但随后比较的是numberno's变量

此外,避免使用列表作为列表名称;给它起一个其他的名字,比如一个清单,或者一些描述性的东西

其他人已经给了你很好的答案。万一你很难理解,这就是你试图做的:

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]

简单的列表理解

>>> 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]
使用地图:

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==0,True==1。对bool调用int将分别返回1或0表示true或false

注意,在Python3中,map返回一个迭代器。因此,您应该在外部地图上列出呼叫列表

这个怎么样:

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

“number”vs“numbers”-1用于声明您发布的代码,当它没有这样做时,会给出您发布的输出。如果您对某些代码有问题,请显示您正在运行的实际代码。我对答案进行了计时:我的答案很快,就像intbooli的第二个选项一样,因为只有类型转换,没有像I>0或某种If/else这样的检查。@rednaw:是的,这一个没有分支,因此,虽然我还没有测试测试,但它承诺会更快timeits@inspectorG4dget我给答案计时:我的答案是faster@InbarRose:有趣。我想知道三元运算符是否是超级运算符optimized@inspectorG4dgetpython中的函数调用不是免费的,做得越少越好为什么投票结果会上升?我鼓励投票人运行代码,看看会发生什么。提示:number是为列表中的每个值设置的局部变量,而不是指向列表中对象的神奇指针。更改它不会更改列表。糟糕,我完全删除了代码。列表理解速度更快,我对答案进行了计时:@InbarRose,太好了,感谢测试-值得投票!如果不能保证数字为非负,则需要使用显式与0比较的版本之一。在这种情况下,如上所述,最适合。然而,在OP的问题中,函数的编写没有对负数发生什么情况的条件,而且-这似乎是一种将值列表规范化为有值列表和无值列表的尝试。数学中非常常见的运算。如果不是这样的话,我会很惊讶的。+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]
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))
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