Python安排一个列表以包含重复项

时间:2018-10-10 15:35:10

标签: python pandas list duplicates unique

我在Python中有一个类似于以下内容的列表:

x = [1,2,2,3,3,3,4,4]

有没有办法使用熊猫或其他一些列表理解来使列表看起来像这样,类似于队列系统:

x = [1,2,3,4,2,3,4,3]

4 个答案:

答案 0 :(得分:2)

可以通过使用cumcount

s=pd.Series(x)
s.index=s.groupby(s).cumcount()
s.sort_index()
Out[11]: 
0    1
0    2
0    3
0    4
1    2
1    3
1    4
2    3
dtype: int64

答案 1 :(得分:0)

如果您将每个值(分组依据)的列表分成一个单独的列表,则可以使用itertools recipe roundrobin来获得以下行为:

x = ([1, 2, 2, 3, 3, 3, 4, 4])
roundrobin(*(g for _, g in groupby(x)))

答案 2 :(得分:0)

如果我对您的理解正确,那么您想保留所有重复项,然后按顺序排列列表,以便您创建实质上是唯一值的单独列表,但它们都被合并为一个列表,按顺序。

我认为这在listcomp中是不可能的,而且对于在熊猫中轻松/快速地完成它,我没有任何反应。

但是简单的算法是:

  • 为每组唯一值创建一个不同的列表:对于x中的i:如果x不在list1中,则添加到列表1中;否则,如果不在list2中,则添加到list2中;否则,如果不在list3中,则广告到list3;等等。如果列表数量无法预测,肯定有一种方法可以实现递归。
  • 根据列表的值评估列表,以确定要在最终列表中列出它们的顺序。从您的帖子中还不清楚您希望它们处于什么顺序。通过第0位的值查询可能是一种方法。将整个列表彼此评估为> =是另一种方式。
  • 一旦有了那组列表及其顺序,就可以很容易地将它们按顺序连接到最终列表中。

答案 3 :(得分:0)

基本上您想要的是模式,该模式不过是我们遍历list x时发现唯一编号的顺序,例如:如果x = [4,3,1,3,5]然后pattern = 4 3 1 5,现在帮助我们再次填充x,以使output will be [4,3,1,5,3]

from collections import defaultdict
x =  [1,2,2,3,3,3,4,4]

counts_dict = defaultdict(int)
for p in x:
    counts_dict[p]+=1

i =0
while i < len(x):
    for p,cnt in counts_dict.items():
        if i < len(x):  
            if cnt > 0:
                x[i] = p
                counts_dict[p]-=1
                i+=1
            else:
                continue
        else:
            # we have placed all the 'p'
            break

print(x) # [1, 2, 3, 4, 2, 3, 4, 3]

注意: python 3.6+字典遵循插入顺序,我假设您使用的是python3.6 +。

这是我一开始想做的,但是在某些情况下会失败。

'''
x = [3,7,7,7,4]

i = 1
while i < len(x):
    if x[i] == x[i-1]:
        x.append(x.pop(i))
        i = max(1,i-1)
    else:    
        i+=1

print(x) # [1, 2, 3, 4, 2, 3, 4, 3]


# x =    [2,2,3,3,3,4,4]
# output [2, 3, 4, 2, 3, 4, 3]

# x =    [3,7,1,7,4]
# output [3, 7, 1, 7, 4]

# x =    [3,7,7,7,4]
# output time_out

'''