Python 当列表中的元素是列表本身时,删除重复项并保持顺序
在尝试进行节点分析时,我遇到以下问题: 例如:Python 当列表中的元素是列表本身时,删除重复项并保持顺序,python,Python,在尝试进行节点分析时,我遇到以下问题: 例如: my_list=[[1,2,3,1],[2,3,1,2],[3,2,1,3]] 我想编写一个函数,用以下方式处理我的元素列表中的元素列表: -my_列表列表中某些元素的出现次数并不重要,只要列表中的唯一元素相同,它们就相同 根据上述前提找到相同的循环,只保留 第一个,并忽略my_列表的其他相同列表,同时保留 命令 因此,在上面的示例中,函数应该只返回第一个列表,即[1,2,3,1],因为my_list中的所有列表基于上述前提是相等的 我用pyth
my_list=[[1,2,3,1],[2,3,1,2],[3,2,1,3]]
我想编写一个函数,用以下方式处理我的元素列表中的元素列表:
-my_列表列表中某些元素的出现次数并不重要,只要列表中的唯一元素相同,它们就相同
根据上述前提找到相同的循环,只保留
第一个,并忽略my_列表的其他相同列表,同时保留
命令
因此,在上面的示例中,函数应该只返回第一个列表,即[1,2,3,1],因为my_list中的所有列表基于上述前提是相等的
我用python编写了一个函数来实现这一点,但我认为它可以缩短,我不确定这是否是一种有效的方法。这是我的密码:
def _remove_duplicate_loops(duplicate_loop):
loops=[]
for i in range(len(duplicate_loop)):
unique_el_list=[]
for j in range(len(duplicate_loop[i])):
if (duplicate_loop[i][j] not in unique_el_list):
unique_el_list.append(duplicate_loop[i][j])
loops.append(unique_el_list[:])
loops_set=[set(x) for x in loops]
unique_loop_dict={}
for k in range(len(loops_set)):
if (loops_set[k] not in list(unique_loop_dict.values())):
unique_loop_dict[k]=loops_set[k]
unique_loop_pos=list(unique_loop_dict.keys())
unique_loops=[]
for l in range(len(unique_loop_pos)):
unique_loops.append(duplicate_loop[l])
return unique_loops
您可以使用字典以一种相当简单的方式完成它。但是您需要使用
frozenset
而不是set
,因为集合是可变的,因此不可散列
def _remove_duplicate_lists(duplicate_loop):
dupdict = OrderedDict((frozenset(x), x) for x in reversed(duplicate_loop))
return reversed(dupdict.values())
我应该这样做。请注意double reversed(),因为通常情况下,最后一项是保留的项,您希望保留第一项,而double reversed可以实现这一点
编辑:更正,是的,根据Steven的回答,它必须是OrderedDict(),否则返回的值将不正确。他的版本可能也会稍微快一点
再次编辑:如果列表的顺序很重要,您需要一个有序的dict。说你的名单是
[[1,2,3,4], [4,3,2,1], [5,6,7,8]]
订购的dict版本将始终返回
[[1,2,3,4], [5,6,7,8]]
但是,常规dict版本可能返回上述内容,也可能返回
[[5,6,7,8], [1,2,3,4]]
如果您不介意,非有序的dict版本可能会更快/使用更少的内存。您可以使用字典以一种相当简单的方式完成。但是您需要使用
frozenset
而不是set
,因为集合是可变的,因此不可散列
def _remove_duplicate_lists(duplicate_loop):
dupdict = OrderedDict((frozenset(x), x) for x in reversed(duplicate_loop))
return reversed(dupdict.values())
我应该这样做。请注意double reversed(),因为通常情况下,最后一项是保留的项,您希望保留第一项,而double reversed可以实现这一点
编辑:更正,是的,根据Steven的回答,它必须是OrderedDict(),否则返回的值将不正确。他的版本可能也会稍微快一点
再次编辑:如果列表的顺序很重要,您需要一个有序的dict。说你的名单是
[[1,2,3,4], [4,3,2,1], [5,6,7,8]]
订购的dict版本将始终返回
[[1,2,3,4], [5,6,7,8]]
但是,常规dict版本可能返回上述内容,也可能返回
[[5,6,7,8], [1,2,3,4]]
如果您不介意,非有序dict版本可能会更快/使用更少的内存。是否需要列表?不能/不应该使用集合数据结构而不是列表吗?此外,Python不使用
@limelights:在我访问python之前,我在玩C#和Java,这是我3年前短暂使用的语言。于是养成了这样的习惯@约尔:我正在输出从节点分析中得到的循环列表,并随它一起走了很远。请建议是否有合适的数据结构。@Jack_of_All_Trades:我只是指出在使用另一种语言时需要放弃C#/Java约定。在申报方面没有问题。我只是想说服你放弃使用分号。它需要是一个列表吗?不能/不应该使用集合数据结构而不是列表吗?此外,Python不使用
@limelights:在我访问python之前,我在玩C#和Java,这是我3年前短暂使用的语言。于是养成了这样的习惯@约尔:我正在输出从节点分析中得到的循环列表,并随它一起走了很远。请建议是否有合适的数据结构。@Jack_of_All_Trades:我只是指出在使用另一种语言时需要放弃C#/Java约定。在申报方面没有问题。我只是想说服你放弃使用分号。谢谢你的回答。谢谢你的回答。