簡體   English   中英

對 python 列表中的連續項目對進行排序

[英]Sorting consecutive pairs of items in a python list

我擁有的數據實際上包含在 pandas dataframe 中(在列上),但為了這篇文章,我們將其提取到問題的核心。

假設我們有一個 dataframe df ,其中有一列col1 ,我們將其存儲為一個列表: L = df.col1.tolist() 現在,我有大約 2000 個這些列/列表,平均長度約為 300-400。 所以這里沒有對性能的巨大需求。

回到我們的 MWE 列表,它的結構是這樣的(ish):

L = [1,2,2,1,3,3,4,4,5,5,6,6,1,2,1,2,7,7,8,8]

現在列表中項目的結構方式應該是連續對的結構(但出於數據收集的原因,它們不是)。 所以這是我們的目標排序列表:

L = [1,1,2,2,3,3,4,4,5,5,6,6,1,1,2,2,7,7,8,8]

為了清楚起見,我將這些添加為元組:

L = [(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(1,1),(2,2),(7,7),(8,8)]

這就是問題所在:這些列包含幾乎連續的項目對(上例中的數字),但其中一些是亂序的,必須移回它們的伙伴(見上文)。

需要注意的幾點:

  • 上面的列表包含數字,實際上,我們正在處理字符串
  • 數據通常位於 pandas dataframe 的列中(不確定這是否有幫助,但可能)
  • 性能並不是真正的問題,因為它們只需要排序一次
  • 亂序模式並不一致,每列中的事情都發生了很多變化,重要的是每個項目都映射回其伙伴。

我正在尋找一種可以將這些列表/列排序為所需的對順序的方法。 謝謝!

好的,既然你可以保證它們總是成對的,我只需要保持一個運行計數,你基本上只需要按照遇到配對中第一個項目的順序生成一個元素列表(所以當計數是等於零),當計數變為 2 時,重置該項目的計數。 然后只需將第一個元素的列表按順序“分解”成對列表,如此快速而骯臟:

In [1]: L = [1,2,2,1,3,3,4,4,5,5,6,6,1,2,1,2,7,7,8,8]

In [2]: from collections import Counter

In [3]: counts = Counter()

In [4]: order = []

In [5]: for x in L:
   ...:     n = counts[x]
   ...:     if n == 0:
   ...:         order.append(x)
   ...:         counts[x] += 1
   ...:     elif n == 2:
   ...:         counts[x] = 0
   ...:     else:
   ...:         counts[x] += 1
   ...:

In [6]: order
Out[6]: [1, 2, 3, 4, 5, 6, 1, 2, 7, 8]

In [7]: result = []

In [8]: for x in order:
   ...:     result.append(x)
   ...:     result.append(x)
   ...:

In [9]: result
Out[9]: [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 1, 1, 2, 2, 7, 7, 8, 8]

當然,您應該制作一個 function 來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM