-3

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

[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]
4

7 回答 7

14
>>> 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
于 2013-07-22T12:52:35.713 回答
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]
于 2013-07-22T13:01:03.597 回答
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]

或者

newList = [int(bool(i)) for i in myList]
于 2013-07-22T12:53:09.120 回答
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 列表理解与。地图

于 2013-07-22T12:54:31.127 回答
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。调用int()bool 将分别返回 1 或 0 来表示真或假。

请注意,在 Python 3 中,map 返回一个迭代器。所以你应该打电话list()给外面map()

于 2013-07-22T13:02:08.487 回答
1

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

另外,避免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]
于 2013-07-22T12:54:45.993 回答
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
于 2013-07-22T13:18:13.780 回答