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

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

感谢您对此的任何帮助。

4

4 回答 4

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一个组中的 s,然后是4s,等等。然后,我们使用组号的循环迭代来压缩每个组,然后是足够的-1值来替换其余的计数。小组的长度决定了我们骑车的频率;zip()当最短的可迭代(g,组)完成时停止。因此,[2, 2, 2, 2]与自行车配对[2, -1]成为[2, -1, 2, -1].

于 2013-10-29T01:10:22.277 回答
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

编辑:看起来您需要为 <= 1 的任何内容添加特殊情况,但除此之外,这应该可以

于 2013-10-29T01:06:57.203 回答
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]
于 2013-10-29T01:13:17.003 回答
0

例如,一旦您点击 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]
于 2013-10-29T01:20:15.883 回答