python嵌套列表内部比较和编辑

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)

这将逐个浏览列表,并从当前子列表(s创建一个集合。然后,如果有另一个集合t与它有一个非空的交集,它将签入结果。如果是这样,那么s中的项目将添加到设置t中。如果没有带非空交集的t,那么s是一个新的独立结果,可以附加到结果列表中。

像这样的问题也是定点迭代的一个很好的例子。在这种情况下,您将查看列表并继续合并子列表,只要您仍然可以找到重叠的列表。您可以使用itertools.combinations来实现此功能,以查看子列表对:

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