尝试进行节点分析时遇到以下问题:
例如:
my_list=[[1,2,3,1],[2,3,1,2],[3,2,1,3]]
我想编写一个函数,以下列方式处理my_list中的element_list:
- my_list列表中某些元素的出现次数并不重要,只要列表中的唯一元素相同,它们就是相同的。
根据上述前提找到相同的循环,只保留 第一个,并在保留时忽略my_list的其他相同列表 订单。
因此,在上面的例子中,函数应该只返回第一个列表[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
答案 0 :(得分:4)
from collections import OrderedDict
my_list = [[1, 2, 3, 1], [2, 3, 1, 2], [3, 2, 1, 3]]
seen_combos = OrderedDict()
for sublist in my_list:
unique_elements = frozenset(sublist)
if unique_elements not in seen_combos:
seen_combos[unique_elements] = sublist
my_list = seen_combos.values()
答案 1 :(得分:2)
你可以使用字典以相当简单的方式完成它。但是您需要使用frozenset
而不是set
,因为集合是可变的,因此无法播放。
def _remove_duplicate_lists(duplicate_loop):
dupdict = OrderedDict((frozenset(x), x) for x in reversed(duplicate_loop))
return reversed(dupdict.values())
应该这样做。请注意double reverse(),因为通常 last 项是保留的项,您希望第一个,双重反转可以实现。
编辑:更正,是的,根据史蒂文的答案,它必须是OrderedDict(),否则返回的值将不正确。他的版本可能会稍微快一点......
再次编辑:如果列表的顺序很重要,您需要一个有序的字典。说你的清单是
[[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版本可能更快/使用更少的内存。