Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除列表中重复元素的组,但在Python中保留第一个。两张名单_Python_List - Fatal编程技术网

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

删除列表中重复元素的组,但在Python中保留第一个。两张名单,python,list,Python,List,基本上我有两个列表(长度约4000)。一个有表示状态的整数,另一个有时间值。在状态列表中,我有一组重复的整数,我想删除这些整数,但保留每个分组的第一个整数。同时,对于状态列表中删除的任何元素,我希望删除时间列表中相同索引的元素。我不会用字典 (第一次在这个网站上,如果我做错了,请原谅我) 这是我迄今为止尝试过的代码,它将我的列表一分为二,但我仍然有重复状态 for i in range (len(state)): if state[i] == state[i-1]: st

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

请注意,使用
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