Python упорядочивает список для включения дубликатов - PullRequest
0 голосов
/ 10 октября 2018

У меня есть список в Python, который похож на:

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

Есть ли способ использовать панды или другое понимание списка, чтобы список выглядел так, как в системе очередей:

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

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

по сути, вам нужен шаблон, этот шаблон - не что иное, как порядок, в котором мы нашли уникальные числа при обходе list x, например: if x = [4,3,1,3,5], тогда pattern = 4 3 1 5, и теперь это поможет нам заполнить * 1004.* снова так, что 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

'''
0 голосов
/ 10 октября 2018

Если вы разделите свой список на один отдельный список для каждого значения (для групп), вы можете использовать рецепт itertools roundrobin, чтобы получить следующее поведение:

x = ([1, 2, 2, 3, 3, 3, 4, 4])
roundrobin(*(g for _, g in groupby(x)))
0 голосов
/ 10 октября 2018

Если я правильно вас понимаю, вы хотите сохранить все дубликаты, но затем упорядочить список в порядке, в котором вы создаете, по сути, отдельные списки уникальных значений, но все они объединяются в один список., по порядку.

Я не думаю, что это возможно в listcomp, и мне ничего не приходит в голову, чтобы сделать это легко / быстро в пандах.

Но простой алгоритм таков:

  • Создайте отдельный список для каждого набора уникальных значений: Для i в x: если x отсутствует в list1, добавьте в список 1;иначе, если нет в list2, добавить в list2;иначе, если нет в list3, объявление в list3;и так далее.Конечно, есть способ сделать это с помощью рекурсии, если это непредсказуемое количество списков.
  • Оцените списки на основе их значений, чтобы определить порядок, в котором вы хотите, чтобы они были перечислены в окончательном списке.Из вашего поста неясно, в каком порядке вы хотите, чтобы они были. Запрос по значению в 0-й позиции может быть одним из способов.Оценивать целые списки как> = друг друга - это другой способ.
  • Как только у вас есть этот набор списков и их порядки, легко объединить их по порядку в окончательном списке.
0 голосов
/ 10 октября 2018

Это возможно, используя 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
...