我有一个列表,例如[[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)
谢谢
答案 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