基本上,我有两个列表(长度约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)
请注意,两个列表的长度相同
答案 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)
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]