【问题标题】:Python arranging a list to include duplicatesPython安排列表以包含重复项
【发布时间】:2019-03-15 13:57:17
【问题描述】:

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

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

有没有办法使用 pandas 或其他一些列表推导使列表看起来像这样,类似于队列系统:

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

【问题讨论】:

    标签: python pandas list duplicates unique


    【解决方案1】:

    有可能,通过使用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
    

    【讨论】:

      【解决方案2】:

      如果您将列表拆分为每个值的单独列表 (groupby),则可以使用 itertools recipe roundrobin 获得此行为:

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

      【讨论】:

        【解决方案3】:

        如果我对您的理解正确,您希望保留所有重复项,然后按顺序排列列表,您可以在其中创建本质上是唯一值的单独列表,但它们都连接到一个列表中,按顺序。

        我认为这在 listcomp 中是不可能的,而且我在 pandas 中轻松/快速地完成它并没有发生任何事情。

        但简单的算法是:

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

        【讨论】:

          【解决方案4】:

          基本上你想要的是模式,这个模式只不过是我们在遍历list x 时找到唯一数字的顺序,例如:如果x = [4,3,1,3,5] 然后pattern = 4 3 1 5,现在这将帮助我们填写@987654324 @再次这样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+ dict 尊重插入顺序,我假设您使用的是 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
          
          '''
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-31
            • 1970-01-01
            • 2011-09-25
            相关资源
            最近更新 更多