Python 从重复索引列表创建虚拟索引列表

Python 从重复索引列表创建虚拟索引列表,python,list,python-2.7,count,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,-

一定有一个简单的方法,但我似乎不知道该怎么做。我有一张这样的清单

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
它不考虑重复整数。如果不重置或继续计数,我真的看不到一种简单的方法来计算循环中整数的位置


谢谢你在这方面的帮助

你想要这样的东西吗

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
def idx(列表):
xList=列表
i=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
def idx(列表):
xList=列表
i=0
而我
编辑:看起来您需要为任何更容易使用的添加特殊情况,然后使用一些迭代魔术来生成所需的输出:

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
s,然后是
4
s,等等。然后,我们使用组号的循环iterable,然后是足够的
-1
值来替换剩余的计数。团队的长度决定了我们循环的频率
zip()
在完成最短的iterable(
g
,组)时停止。因此,
[2,2,2,2]
与循环
[2,-1]
配对成为
[2,-1,2,-1]
更易于使用,然后使用一些迭代魔法来产生所需的输出:

from itertools import groupby, cycle

output = [res for k, g in groupby(l) for orig, res in zip(g, cycle([k] + [-1] * (k - 1)))]
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]
这将产生:

>>> 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
s,然后是
4
s,等等。然后,我们使用组号的循环iterable,然后是足够的
-1
值来替换剩余的计数。团队的长度决定了我们循环的频率
zip()
在完成最短的iterable(
g
,组)时停止。因此,
[2,2,2]
与循环
[2,-1]
配对成为
[2,-1,2,-1]
中的[15]:%paste
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]
def idx(L): 答案=[] i=0 而我在[15]中
:%paste
def idx(L):
答案=[]
i=0

例如,当您点击a
3
时,我,您知道您希望以下两项被替换为
-1
。。。因此,一个简单的解决方案就是通过分配给一个切片来继续并替换它们:

>>> my_list = [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]
>>> for i, x in enumerate(my_list):
...     if x != -1:
...         my_list[i+1:i+x] = [-1] * (x - 1)
... 
>>> my_list
[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]

例如,当您点击a
3
,您就知道您希望以下2项被替换为
-1
。。。因此,一个简单的解决方案就是通过分配给一个切片来继续并替换它们:

>>> my_list = [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]
>>> for i, x in enumerate(my_list):
...     if x != -1:
...         my_list[i+1:i+x] = [-1] * (x - 1)
... 
>>> my_list
[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]

有点急促的打字错误,我修正了你正在破坏输入。你需要做
xList=List[:]
如果你不想做那种急促的打字,我修正了你正在破坏输入。如果要避免这样做,您需要执行
xList=List[:]
that@inspectorG4dget:我移除了
链()
;在我注意到它实际上不是正确的输出之前,~~I+1d。OP不想在输入中循环3个长链;OP想要一个3,其他的都用-1代替。~~没关系,我看错了OP!在这里,当你使用这些工具时,我试图解决一个更难的问题;)@KarlKnechtel:如果团队中的其他成员需要被
-1
替换,不管重复次数如何,这其实也很简单;然后您可以只在
[-1]
上循环。。。。某种程度上?您需要
a
k
链接到-1值上,是吗?是的,您需要使用
chain([(k,next(g))],zip(g,cycle([-1]))
,然后只选择每个元组的第二个元素。@inspector4dget:我删除了
chain()
;在我注意到它实际上不是正确的输出之前,~~I+1d。OP不想在输入中循环3个长链;OP想要一个3,其他的都用-1代替。~~没关系,我看错了OP!在这里,当你使用这些工具时,我试图解决一个更难的问题;)@KarlKnechtel:如果团队中的其他成员需要被
-1
替换,不管重复次数如何,这其实也很简单;然后您可以只在
[-1]
上循环。。。。某种程度上?你需要
a
k
链接到-1值上,是吗?是的,你需要使用
chain([(k,next(g))],zip(g,cycle([-1]))
然后只选择每个元组的第二个元素。我没有拒绝它,我只是下班回家看到了这一点。再次感谢。我没有不接受,我只是下班回家看到了这个。再次感谢。