如果嵌套列表项的顺序相同,但从不同的索引开始,如何从python列表中删除它们
如何从嵌套列表中删除“循环相似”列表。如果两个列表在循环旋转后相同,则它们“循环相似”。例如如果嵌套列表项的顺序相同,但从不同的索引开始,如何从python列表中删除它们,python,Python,如何从嵌套列表中删除“循环相似”列表。如果两个列表在循环旋转后相同,则它们“循环相似”。例如 [1,2,3,4]与[3,4,1,2]循环相似,因为[1,2,3,4]旋转2是[3,4,1,2] 假设我有以下列表: list=[[1,1,0]、[0,1,1]、[1,1,1]] 我想将[0,1,1]删除,因为它在旋转2后与[1,1,0]循环相似。我应该如何处理这个问题?您首先需要检查两个列表在轮换下是否相同 # not very efficient algorithm but it works #
[1,2,3,4]
与[3,4,1,2]
循环相似,因为[1,2,3,4]
旋转2是[3,4,1,2]
假设我有以下列表:
list=[[1,1,0]、[0,1,1]、[1,1,1]]
我想将
[0,1,1]
删除,因为它在旋转2后与[1,1,0]
循环相似。我应该如何处理这个问题?您首先需要检查两个列表在轮换下是否相同
# not very efficient algorithm but it works
# you can also import deque from collections for rotation operation
def is_circular_equal(a,b):
if len(a) != len(b):
return False # if they are not of equal length
for i in range(len(a)):
if b == a[i:]+a[:i]:
return True
return False
这是另一篇关于如何做到这一点的帖子
然后在列表中循环检查每个列表是否与另一个列表相等。首先需要检查两个列表在旋转时是否相同
# not very efficient algorithm but it works
# you can also import deque from collections for rotation operation
def is_circular_equal(a,b):
if len(a) != len(b):
return False # if they are not of equal length
for i in range(len(a)):
if b == a[i:]+a[:i]:
return True
return False
这是另一篇关于如何做到这一点的帖子
然后在列表中循环检查每个列表是否与另一个相同,我会做如下操作:
xs = [[1, 1, 0], [0, 1, 1], [1, 1, 1]]
sorted_list = list(map(lambda x: sorted(x), xs))
final_list = []
for x in sorted_list:
if x in final_list:
continue
final_list.append(x)
我会这样做:
xs = [[1, 1, 0], [0, 1, 1], [1, 1, 1]]
sorted_list = list(map(lambda x: sorted(x), xs))
final_list = []
for x in sorted_list:
if x in final_list:
continue
final_list.append(x)
下面是一个糟糕的解决方案(二次复杂性):
对于一个好的解决方案,我会考虑是否可以为每个旋转相同的列表生成一个唯一的值,然后将该值用作一个集合的元素来测试其存在性。这是一个糟糕的解决方案(二次复杂性):
对于一个好的解决方案,我会考虑是否可以为每个旋转的相同列表生成一个唯一的值,然后将该值用作集合的一个元素来测试是否存在。如何将
[0,1,1]
与[1,1,0]
的顺序相同?这是否回答了您的问题@ChayimFriedman将其视为一种模,如果你将索引移动1,你将得到相同的列表。否@Countour integration不要覆盖内置的列表如何将[0,1,1]
与[1,1,0]
的顺序相同?这回答了你的问题吗@ChayimFriedman将其视为一种模,如果你将索引移动1,你将得到相同的列表。不@Countour integral不要覆盖内置的list
可能被视为超出范围,但我至少会确保它们具有相同的长度。使用collections.deque
更好,特别是如果有多个包含许多元素的列表。看@l3via,我不想让代码变长。但有必要检查它们是否具有相同的长度,并返回False,否则可能会被视为超出范围,但我至少会确保它们具有相同的长度。使用collections.deque
更好,尤其是如果有多个包含多个元素的列表。看@l3via,我不想让代码变长。但有必要检查它们是否具有相同的长度,并返回False。否则,这不会解决上述问题,但会比较无序列表(已在中介绍)。这不会解决上述问题,但会比较无序列表(已在中介绍)让子列表colection.deques有帮助吗?我想这会有助于降低旋转的成本,但不会解决嵌套for循环的问题。它是二次的,即使你假设旋转的eq是O(1)。如果你按列表长度划分组会更好。复杂度最好的方法是使用元组和集合。转换(列表->元组->返回列表)可能会更昂贵,但如果有许多列表,这仍然可能更昂贵better@ChayimFriedman当然但这并没有改变渐近复杂性,这就是为什么我认为它是过早的优化。一旦主要问题得到解决(为每个列表生成一个键值),这可能就没有必要了。它是否有助于使子列表合并。deques?我想这将有助于降低旋转的成本,但它不会解决嵌套for循环的问题。它是二次的,即使你假设旋转的eq是O(1)。如果你按列表长度划分组会更好。复杂度最好的方法是使用元组和集合。转换(列表->元组->返回列表)可能会更昂贵,但如果有许多列表,这仍然可能更昂贵better@ChayimFriedman当然但这并没有改变渐近复杂性,这就是为什么我认为它是过早的优化。一旦主要问题得到解决(为每个列表生成一个键值),这可能就没有必要了。