从1

时间:2018-05-05 23:06:14

标签: python

我有一个列表,例如[[0, 0], [4, 0], [2, 0], [5, 3], [0, 1]]

我想要的输出是[[0, 0], [1, 0], [2, 0], [3, 4], [0, 5]]

也就是说,我希望修改列表,如果值不为零,我将其设置为count,从1开始,每个非零值递增1。如果它为0,我将其保持为0.

我该如何解决这个问题?我开始使用enumerate编制索引,但这比我想象的要难。

以下是我所做的:w生成初始列表。这不是我的完整代码,因为发布时间过长。

w = [[i if i != l else 0 for i in x] for x in c]
print(w)
inc = 1
lx = []
gg = []
for i in w:
   if i[0] or i[1] !=0:
      g = w.index(i)
      gg.append(g)
      lx.append(i)
for x in gg:
   for i, v in enumerate(w):
       if x==i:
          if
          print(x, i, v)

谢谢

3 个答案:

答案 0 :(得分:3)

这也可以使用列表理解来实现,可能更加pythonic和更短:

from itertools import count

lst = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1]]
counter = count(1)

lst = [[next(counter) if x != 0 else 0 for x in sublst] for sublst in lst]
# [[0, 0], [1, 0], [2, 0], [3, 4], [0, 5]]

详细了解itertools.count的工作原理here,同时这里有一小段内容可让您更好地理解:

>>> import itertools
>>> c = itertools.count(1)
>>> next(c)
1
>>> next(c)
2

答案 1 :(得分:1)

我认为你过度复杂了。如果elem为0,则不需要触摸它。如果它是别的东西,递增计数并将其粘贴在正确的位置。

nums = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1]]
count = 0
for i,(a,b) in enumerate(nums):
  if a != 0:
    count += 1
    nums[i][0] = count
  if b != 0:
    count += 1
    nums[i][1] = count

print nums

输出:

[[0, 0], [1, 0], [2, 0], [3, 4], [0, 5]]

答案 2 :(得分:0)

如果你的子列表是两个元素,你可以摆脱枚举

from itertools import count
counter = count(1)
lst = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1]]
for pair in lst:
    pair[0] = next(counter) if pair[0] else 0
    pair[1] = next(counter) if pair[1] else 0
print(lst)

对于较长或可变的子列表,您可以使用枚举,地图或列表理解

from itertools import count
counter = count(1)
lst = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1], [0, 1, 3, 3, 3], [3]]
for sublist in lst:
    sublist[:] = map(lambda x: (next(counter) if x else 0), sublist)
    # slice assignment is 'in-place' assignment



from itertools import count
counter = count(1)
lst = [[0, 0], [4, 0], [2, 0], [5, 3], [0, 1], [0, 1, 3, 3, 3], [3]]
for sublist in lst:
    for i, element in enumerate(sublist):
        sublist[i] = next(counter) if element else 0