我在Python中有一个类似于以下内容的列表:
x = [1,2,2,3,3,3,4,4]
有没有办法使用熊猫或其他一些列表理解来使列表看起来像这样,类似于队列系统:
x = [1,2,3,4,2,3,4,3]
答案 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中是不可能的,而且对于在熊猫中轻松/快速地完成它,我没有任何反应。
但是简单的算法是:
答案 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
'''