Удаление групп дублирующихся элементов в списке, но сохранение первого в Python.Два списка - PullRequest
2 голосов
/ 09 апреля 2019

В основном у меня есть два списка (длина около 4000). у одного есть целые числа, которые представляют состояние, у другого есть значения времени. У меня есть группы повторяющихся целых чисел в списке состояний, которые я хочу удалить, но оставляю первое для каждой группировки. В то же время для любого элемента, удаленного в списке состояний, я хочу удалить элемент с тем же индексом в списке времени. Я не могу использовать словари.

(впервые на этом сайте, пожалуйста, прости меня, если я делаю это неправильно)

Это код, который я пробовал до сих пор, он разрезал мой список пополам, но я все еще имею повторяющиеся состояния.

for i in range (len(state)):
    if state[i] == state[i-1]:
        state[i] = 0
        tt_time[i] = 0
while 0 in state:
    state.remove(0)
while 0 in tt_time:
    tt_time.remove(0)

Пример того, что я хочу:

[4,4,4,5,5,5,4,4,3,3,5,5] => [4,5,4,3,5] (for state list)

одновременно:

[1,2,3,4,5,6,7,8,9,10,11,12] => [1,4,7,8,11] (for time list)

обратите внимание, что оба списка имеют одинаковую длину

Ответы [ 4 ]

2 голосов
/ 09 апреля 2019

Я бы использовал groupby в этом случае:

from itertools import groupby


state = [4,4,4,5,5,5,4,4,3,3,5,5]
time = [1,2,3,4,5,6,7,8,9,10,11,12]

res1 = []
res2 = [time[0]]
for k, v in groupby(state):
    res1.append(k)
    res2.append(res2[-1] + len(list(v)))
res2.pop()

, который производит:

# res1 -> [4, 5, 4, 3, 5]
# res2 -> [1, 4, 7, 9, 11]
1 голос
/ 09 апреля 2019

Использование zip

Ex:

state = [4,4,4,5,5,5,4,4,3,3,5,5]
time  = [1,2,3,4,5,6,7,8,9,10,11,12]

result_state = []
result_time = []
for s, t in zip(state, time):           #Iterate both lists
    if not result_state:                #Check if result lists are empty.
        result_state.append(s)          
        result_time.append(t)
    else:
        if result_state[-1] != s:       #Check if last element in result is not same as s
            result_state.append(s)
            result_time.append(t)

print(result_state)
print(result_time)

Выход:

[4, 5, 4, 3, 5]
[1, 4, 7, 9, 11]
0 голосов
/ 09 апреля 2019

Другое решение с использованием itertools.groupby:

from itertools import groupby
from operator import itemgetter

l1 = [4,4,4,5,5,5,4,4,3,3,5,5]
l2 = [1,2,3,4,5,6,7,8,9,10,11,12]

grouped = list(map(itemgetter(0), (list(g) for _, g in groupby(zip(l1, l2), key=itemgetter(0)))))
# [(4, 1), (5, 4), (4, 7), (3, 9), (5, 11)]

print(list(map(itemgetter(0), grouped)))
# [4, 5, 4, 3, 5]

print(list(map(itemgetter(1), grouped))) 
# [1, 4, 7, 9, 11]
0 голосов
/ 09 апреля 2019

Вы можете выполнить сопряжение смежных элементов списка state, сжав его сам по себе, но с дополнением элемента, отличного от первого элемента, так что вы можете использовать понимание списка для фильтрации элементов, которые совпадают с соседними. Предметы. Объедините список со списком tt_time, чтобы связать результат с элементами в tt_time:

states, times = map(list, zip(*((a, t) for ((a, b), t) in zip(zip(state, [state[0] + 1] + state), tt_time) if a != b)))

states становится:

[4, 5, 4, 3, 5]

times становится:

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