Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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 - Fatal编程技术网

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约定。在申报方面没有问题。我只是想说服你放弃使用分号。谢谢你的回答。谢谢你的回答。