我有一个元组列表,每个元组包含2个整数。
例如。 [(1, 2), (2, 3), (3, 4), (4, 5), (100, 130), (130, 140), (140, 150), (150, 170)]
如何找到相同的元素? 这里,在这个例子中,1和2是相同的; 2和3相同;所以1和3也是一样的。 上面例子的答案是:
1,2,3,4,5
100,130,140,150,170
如果答案是列表清单,我更愿意,但任何有效的解决方案都可以。
答案 0 :(得分:1)
假设元素在元组中的位置无关紧要(例如,如果你用(2, 1)
代替(1, 2)
,那么它就没有区别了),我认为你需要的是disjoint-set merge,也称为“联合发现”。基本上,你可以迭代你的元组
for t1, t2 in list_of_tuples:
并且对于每个元素,如果它不存在,则在与每个元素对应的数据结构中创建一个集合
disjoint_set_structure.make_set(t1)
disjoint_set_structure.make_set(t2)
然后统一两组
disjoint_set_structure.union(t1, t2)
如果您的实施支持,最终您将能够从disjoint_set_structure
获取不同的群组。
有很多implementations of the disjoint-set data structure available online,您也可以在大约50行代码中轻松创建自己的代码。
答案 1 :(得分:0)
David Z提供了一个出色的解决方案来解决与您类似的更复杂的问题。但我理解你的问题,大卫Z的回答对你的问题有点矫枉过正。您不需要定义任何新类或数据结构。
我认为您需要做的只是将您拥有的每个数字放入一组。由于集合不能包含任何重复元素,因此该过程实际上会找到相同的元素。如下面的代码所示:
list_of_tuples=[(1, 2), (2, 3), (3, 4), (4, 5), (100, 130), (130, 140), (140, 150), (150, 170)]
ans=set()
for t in list_of_tuples:
for num in t:
ans.add(num)
print(list(ans))
答案 2 :(得分:0)
从问题的结果来看,你不太清楚。
您确实提到了列表列表,但未指定创建此列表的条件。
如果您更新问题的条件是将结果拆分为多个列表,要创建列表列表,我会尝试更新此答案
这是一个单行列表,可以生成一个单独的列表。
下式给出:
tuples_v = [(1, 2), (2, 3), (3, 4), (4, 5), (100, 130), (130, 140), (140, 150), (150, 170)]
结果:
result = list(set([value_v for tuple_v in tuples_v for value_v in tuple_v]))