从重复整数列表中创建虚拟索引列表

时间:2013-10-29 01:00:47

标签: python list python-2.7 count

要做到这一点有一个简单的方法,但似乎无法绕过它。我有一个列表,

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

它没有考虑重复整数。我无法真正看到一个简单的方法来计算循环中整数的位置,而不会重置或继续计数。

感谢您提供任何帮助。

3 个答案:

答案 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]