替换列表中的所有负值

时间:2016-09-11 22:37:48

标签: python python-3.x

我正试图在代码大战中解决这个问题而且我完全难过了:

y = [-1, -1, 2, 8, -1, 4]
z = [1,3,5]
#to create [1,3,2,8,5,4]

我该怎么做?

我试着这样做:

for e in range(len(y)):
    try:
        if y[e] < 0:
            y[e] = z[e]
    except:
        pass

但这只有在负面对应z中的情况时才有效。

4 个答案:

答案 0 :(得分:11)

如果您确定负数的数量始终与z相等,则可以将z转换为可迭代,并使用列表推导来创建新列表:

In [9]: z = iter(z)

In [10]: [next(z) if i < 0 else i for i in y]
Out[10]: [1, 3, 2, 8, 5, 4]

请注意,如果z的长度短于负数,则会引发StopIteration错误。

答案 1 :(得分:3)

一衬垫。使用pop()模拟队列行为。 (注意这消耗 z

>>> print([num if num > 0 else z.pop(0) for num in y])
[1, 3, 2, 8, 5, 4]

答案 2 :(得分:0)

您尝试对两个列表使用相同的索引,这似乎不是您示例中的正确行为。例如,y中的-1位于索引4处,但会被索引2处z中的5替换。

zindex = 0
for yindex in range(len(y)):
    if y[yindex] < 0:
        y[yindex] = z[zindex]
        zindex += 1

答案 3 :(得分:0)

您的代码:

for e in range(len(y)):
    if y[e] < 0: y[e] = z[e]

您的代码存在问题,我们说第5个元素是否定的。您正在尝试将y的第5个元素设置为z的第5个元素。相反,您应该使用计数器变量来跟踪要替换的元素。

element_z_index = 0
for e in range(len(y)):
    if y[e] < 0:
        y[e] = z[element_z_index]
        element_z_index += 1