Skip to main content
 首页 » 编程设计

python之处理列表或数组的复杂 Pythonic 方式

2025年05月04日18zengkefu

我想将一个整数值连续分配给列表中连续的相同元素。不应存在​​反向耦合,即列表中后面出现的相同元素不应具有与之前相同的整数值。

初始列表:

x = ["a", "a", "a", "b", "b", "c", "c", "a", "a", "d", "d", "d", "b", "b", "b", "a", "a"] 

所需的整数列表:

y = [0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6] 

我的尝试:

idx = 0 
int_list = list([idx]) 
 
for i in range(1, len(x)): 
    if x[i] != x[i-1]: 
        idx = idx + 1 
    int_list.append(idx) 

不过,我认为还有一种更优雅的方式。甚至可能是两类。

请您参考如下方法:

您可以使用 itertools.groupby 来实现这一点非常简单

a= ["a", "a", "a", "b", "b", "c", "c", "a", "a", "d", "d", "d", "b", "b", "b", "a", "a"] 
b = [] 
for i,(key,group) in enumerate(itertools.groupby(a)): 
    # key is the repeated value ... group is an iterator of all matches 
    b.extend([i for _ in group]) 
 
print(b) 
# [0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6] 

正如@jonclements 在评论中指出的那样,我们可以将其简化为单个列表理解

b = [i for i,(k,g) in enumerate(groupby(a)) for _ in g]