在列表中查找重复项并仅在其中一个上运行

Tom*_*ski 6 python list python-3.x

我扩展并添加了一个新问题.

我有一个清单:

li = [2, 3, 1, 4, 2, 2, 2, 3, 1, 3, 2] 
Run Code Online (Sandbox Code Playgroud)

然后我认识到哪个值最常出现,我保留在变量中的值i2:

f = {}
for item in li:
    f[item] = f.get(item, 0) + 1   

for i in f:
    if f[i]==int(max(f.values())):
       i2 = i
Run Code Online (Sandbox Code Playgroud)

之后,重复的所有值都会增加10,但除了最大值之外.这是我使用的代码:

for i in range(len(li)):
    for x in range(i + 1, len(li)):
        if li[i] == li[x] and li[i] != i2:
           li[x] = li[x] + 10
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我得到:

li = [2, 3, 1, 4, 2, 2, 2, 13, 11, 23, 2]
Run Code Online (Sandbox Code Playgroud)

如您所见,最常见的值是2,因此它保持不变.例如,3发生三次,并且从所有三个新值创建3,3 + 10,3 + 20.并且与值的其余部分相同(除了2).但是如果两个最大值彼此相邻(或者是更长的序列),我想在这样的序列中逐个增加10,然后得到:

li = [2, 3, 1, 4, 2, 12, 22, 13, 11, 23, 2] 
Run Code Online (Sandbox Code Playgroud)

怎么做?我现在可以在新循环上执行相同操作,但已经在更改的列表上并应用条件li[i] == li[i+1],但也许可以在当前循环中完成?

tob*_*s_k 5

首先,您应该使用a collections.Counter来获取列表中元素的计数并查找most_common元素.

li = [2, 3, 1, 4, 2, 2, 2, 3, 1, 3, 2] 
l2 = collections.Counter(li).most_common(1)[0][0]
Run Code Online (Sandbox Code Playgroud)

然后,如果当前元素是最常见元素的第一个匹配Counter项,则可以使用秒作为运行计数,并将其重置为0.然后使用该计数器将10的倍数加到数字上,然后递增它.

running = collections.Counter()
last = None
for i, e in enumerate(li):
    if e == l2 and e != last:
        running[e] = 0
    li[i] = e + 10 * running[e]
    running[e] += 1
    last = e
Run Code Online (Sandbox Code Playgroud)

之后,li[2, 3, 1, 4, 2, 12, 22, 13, 11, 23, 2]