删除列表中重复元素的组,但在Python中保留第一个。两张名单
基本上我有两个列表(长度约4000)。一个有表示状态的整数,另一个有时间值。在状态列表中,我有一组重复的整数,我想删除这些整数,但保留每个分组的第一个整数。同时,对于状态列表中删除的任何元素,我希望删除时间列表中相同索引的元素。我不会用字典 (第一次在这个网站上,如果我做错了,请原谅我) 这是我迄今为止尝试过的代码,它将我的列表一分为二,但我仍然有重复状态删除列表中重复元素的组,但在Python中保留第一个。两张名单,python,list,Python,List,基本上我有两个列表(长度约4000)。一个有表示状态的整数,另一个有时间值。在状态列表中,我有一组重复的整数,我想删除这些整数,但保留每个分组的第一个整数。同时,对于状态列表中删除的任何元素,我希望删除时间列表中相同索引的元素。我不会用字典 (第一次在这个网站上,如果我做错了,请原谅我) 这是我迄今为止尝试过的代码,它将我的列表一分为二,但我仍然有重复状态 for i in range (len(state)): if state[i] == state[i-1]: st
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)
请注意,使用
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]
输出:
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]
在这种情况下,我将使用:
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]
您可以将状态
列表的相邻项配对,方法是将其自身压缩,但填充与第一项不同的项,以便使用列表理解来筛选与相邻项相同的项。使用tt_时间
列表压缩列表,将结果与tt_时间
中的项目配对:
states, times = map(list, zip(*((a, t) for ((a, b), t) in zip(zip(state, [state[0] + 1] + state), tt_time) if a != b)))
状态
变为:
[4, 5, 4, 3, 5]
[1, 4, 7, 9, 11]
时间
变为:
[4, 5, 4, 3, 5]
[1, 4, 7, 9, 11]
另一个解决方案使用:
请注意,两个列表的长度相同请查看itertools.groupby
。