Python nested list internal comparison and editing
我一直在想办法,最简单的解释方法是用一个例子:
1 | a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] |
这就是我从中开始列出的清单。我需要以一个列表结束,该列表包含a中所有列表的列表,其中包含添加在一起的重叠元素。
1 | result = [[1, 2, 4, 5], [0, 3, 6, 7, 8, 12], [14, 18]] |
我该怎么办?
亲切的问候,达奎尔
1 2 3 4 5 6 7 8 9 10 11 | a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] result = [] for s in a: s = set(s) for t in result: if t & s: t.update(s) break else: result.append(s) |
这将逐个浏览列表,并从当前子列表(
像这样的问题也是定点迭代的一个很好的例子。在这种情况下,您将查看列表并继续合并子列表,只要您仍然可以找到重叠的列表。您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | result = [set(x) for x in a] # start with the original list of sets fixedPoint = False # whether we found a fixed point while not fixedPoint: fixedPoint = True for x, y in combinations(result, 2): # search all pairs … if x & y: # … for a non-empty intersection x.update(y) result.remove(y) # since we have changed the result, we haven’t found the fixed point fixedPoint = False # abort this iteration break |
我能想到的一种方法是通过递归。从一个项目开始,然后循环直到找到它连接到的每个数字。对于这些数字中的每一个,您都必须这样做。因此是递归。为了提高效率,请将您访问过的数字存储在一个列表中,并在每个递归序列的开头对其进行检查,以确保不重复任何探索。
两个班轮:
1 2 3 | a_set = [set(x) for x in a] result = [list(x.union(y)) for i,x in enumerate(a_set) for y in a_set[i:] if x.intersection(y) and x != y] |
简单回答:
1 2 3 4 | a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] for x in a: for y in x: print y |
它比第一个更简单:
1 2 3 4 5 6 | box=[] a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] for x in a: for y in x: box.append(y) print box |
结果:[1,2,4,2,5,0,3,7,8,12,3,6,18,14]
通过这个,你可以比较这些数字:
1 2 3 4 5 6 7 8 9 10 11 | box=[] box2="" a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] for x in a: for y in x: box.append(y) print box for a in box: box2+=str(a) print box2 |
结果:12425037812361814
你也可以让它更可爱:
1 | print"".join(box2) |
结果:1 2 4 2 5 0 3 7 8 1 2 3 6 1 8 1 4
我为你留下了最后一步:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] result = [[1, 2, 4, 5], [0, 3, 6, 7, 8, 12], [14, 18]] # each sub list result2 = [] count = 0 print a for sub_list in a: print count print"sub_list:" + str(sub_list) a.pop(count) print"a:" + str(a) #each int sub_list_extend_flag = False for int_in_sub_list in sub_list: print"int_in_sub_list:" + str(int_in_sub_list) for other_sub_list in a: print"current_other_sub_list:" + str(other_sub_list) if int_in_sub_list in other_sub_list: sub_list_extend_flag = True other_sub_list.extend(sub_list) result2.append(list(set(other_sub_list))) if not sub_list_extend_flag: result2.append(sub_list) count += 1 print result2 |