Сортировка последовательных пар элементов в списке Python - PullRequest
0 голосов
/ 24 сентября 2019

Данные, которые у меня есть, на самом деле содержатся в фрейме данных pandas (в столбце), но ради этого поста мы извлекаем их, чтобы добраться до сути проблемы.

Предположим, у нас есть фрейм данных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 (не уверен, поможет ли это, но может)
  • Производительность на самом деле не является проблемой, так как их нужно будет отсортировать только один раз
  • Неупорядоченный шаблон не непротиворечиво, и в каждом столбце многое меняется, важно то, что каждый элемент сопоставляется с его партнером.

Я ищу метод, который может сортировать эти списки /столбцы в требуемом последовательном порядке.Спасибо!

1 Ответ

1 голос
/ 24 сентября 2019

ОК, так как вы можете гарантировать, что они всегда спарены, я бы просто сохранил счетчик прогонов, и вам просто нужно сгенерировать список элементов в порядке, в котором встречается первый элемент в паре (поэтому, когдасчет равен нулю), и когда счет достигнет 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]

Конечно, вы должны создать функцию для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...