删除列表中的重复元素组,但将第一个元素保留在Python中。两份清单

时间:2019-04-09 13:15:12

标签: python list

基本上,我有两个列表(长度约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 个答案:

答案 0 :(得分:2)

在这种情况下,我会使用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 :(得分:0)

使用zip

例如:

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]

答案 2 :(得分:0)

您可以将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]

答案 3 :(得分:0)

使用enter image description here的另一种解决方案:

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]