我有一个整数列表,它看起来像这样:
[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]
答案 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]
答案 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 == 0
和True == 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