要做到这一点有一个简单的方法,但似乎无法绕过它。我有一个列表,
l = [3,3,3,4,4,4,4,2,2,2,2,3,3,3,3,3,3,3,3,3,2,2,5,5,5,5,5,3,3,3,3,3,3]
这是一个整数列表,它重复整数给出的次数,例如,如果列表中的整数是5,则重复5次。我想保留列表的结构并将其转换为像
这样的东西l = [3,-1,-1,4,-1,-1,-1,2,-1,2,-1,3,-1,-1,3,-1,-1,3,-1,-1,2,-1,2,-1,5,-1,-1,-1,-1,3,-1,-1,3,-1,-1]
用-1替换重复的整数。我想保留第一个整数N并用N-1 -1替换它后面的重复整数。我的问题是当相同的整数彼此相邻时的情况。在那种情况下,我得到了,
l = [3,-1,-1,4,-1,-1,-1,2,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,5,-1,-1,-1,-1,3,-1,-1,-1,-1,-1]
任何人都可以想办法解决这个问题吗?
到目前为止,我有代码,
def idx(List):
xList = []
xList.append(List[0])
for i in range(0, len(List)):
if (i+1) in range(len(List)):
if List[i] == List[i+1]:
xList.append(-1)
elif tscList[i] != List[i+1]:
xList.append(List[i+1])
else:
break
return xList
它没有考虑重复整数。我无法真正看到一个简单的方法来计算循环中整数的位置,而不会重置或继续计数。
感谢您提供任何帮助。
答案 0 :(得分:4)
使用itertools.groupby()
更容易,然后使用一些迭代魔术来产生所需的输出:
from itertools import groupby, cycle
output = [res for k, g in groupby(l) for orig, res in zip(g, cycle([k] + [-1] * (k - 1)))]
这会产生:
>>> from itertools import groupby, cycle
>>> l = [3,3,3,4,4,4,4,2,2,2,2,3,3,3,3,3,3,3,3,3,2,2,5,5,5,5,5,3,3,3,3,3,3]
>>> [res for k, g in groupby(l) for orig, res in zip(g, cycle([k] + [-1] * (k - 1)))]
[3, -1, -1, 4, -1, -1, -1, 2, -1, 2, -1, 3, -1, -1, 3, -1, -1, 3, -1, -1, 2, -1, 5, -1, -1, -1, -1, 3, -1, -1, 3, -1, -1]
groupby()
没有平等的关键功能组;你得到相同重复数字的组。因此,您首先获得组中的3
,然后获取4
等等。然后我们使用组编号的循环迭代压缩每个组,然后输入足够的-1
个值替换其余的计数。组的长度决定了我们循环的频率;当最短的可迭代(zip()
,组)完成时,g
停止。因此,[2, 2, 2, 2]
与自行车[2, -1]
配对变为[2, -1, 2, -1]
。
答案 1 :(得分:0)
你想要这样的东西吗?
def idx(List):
xList = List
i=0
while i < len(List):
num = xList[i] - 1
xList[i+1 : i+num+1] = [-1] * num
i += num + 1
return xList
编辑:看起来你需要为任何事物添加特殊情况&lt; = 1,但除此之外,这应该有效
答案 2 :(得分:0)
In [15]: %paste
def idx(L):
answer = []
i = 0
while i<len(L):
answer.extend([L[i]]+[-1]*(L[i]-1))
i += L[i]
return answer
## -- End pasted text --
In [16]: idx(L)
Out[16]: [3, -1, -1, 4, -1, -1, -1, 2, -1, 2, -1, 3, -1, -1, 3, -1, -1, 3, -1, -1, 2, -1, 5, -1, -1, -1, -1, 3, -1, -1, 3, -1, -1]