如何加入这些列表的元素?

时间:2019-02-25 06:46:06

标签: python list join merge

给出以下list_a, 我想要一个list_b = [[42,43,46,45,44],[47,48,51,50]]。 我写了这段代码,但无法获得想要的结果。

list_a = [('42', '43'), ('43', '46'), ('44', '45'), ('45', '46'), ('47', '48'), ('48', '51'), ('49', '50'), ('50', '51')]
list_b =[]
for i in range(len(list_a)):
    for j in range(i+1,len(list_a)):
        if  list_a[i][0] ==  list_a[j][0]:
            list_b.insert(0,list_a[i][1])
            list_b.append(list_a[i][0])
            list_b.append(list_a[j][1])
            continue
        if  list_a[i][0] ==  list_a[j][1]:
            list_b.insert(0,list_a[i][1])
            list_b.append(list_a[i][0])
            list_b.append(list_a[j][0])
            continue
        if  list_a[i][1] ==  list_a[j][1]:
            list_b.insert(0,list_a[i][0])
            list_b.append(list_a[i][1])
            list_b.append(list_a[j][1])
            continue
        if  list_a[i][1] ==  list_a[j][1]:
            list_b.insert(0,list_a[i][0])
            list_b.append(list_a[i][1])
            list_b.append(list_a[j][0])
            continue
print(list_b)

过程是这样的: 逐一比较任何两个列表,如果任何两个列表元素具有相同的编号,则将这两个列表合并为一个列表。 ['42', '43'], ['43', '46'] ==> [42,43,46] 然后,比较新列表和任何其他列表,如果任何两个列表元素具有相同的编号,则将这两个列表合并为一个列表。 [42,43,46], ['45', '46'] ==> [42,43,46,45] 就像将某些线段连接到多线段一样。

1 个答案:

答案 0 :(得分:0)

您可以将递归与生成器一起使用:

def get_groups(start, data, _seen=[], _current=[]):
   vals = set(filter(lambda x:x not in _seen, [b for a, b in data if a == start] + [a for a, b in data if b == start]))
   if not vals:
     yield _current
     data = [(a, b) for a, b in data if a not in _seen and b not in _seen]
     if data:
       c, d = data[0][0], data[0][-1]
       yield from get_groups(c, data, _seen=_seen+[c, d], _current=[c, d])
       yield from get_groups(d, data, _seen=_seen+[c, d], _current=[c, d])
   else:
     for i in vals:
       if i not in _seen:
         yield from get_groups(i, data, _seen=_seen+[i], _current=_current+[i])

list_a = [('42', '43'), ('43', '46'), ('44', '45'), ('45', '46'), ('47', '48'), ('48', '51'), ('49', '50'), ('50', '51')]
def get_result(l):
  result = sorted(list(get_groups(l[0][0], l, _seen=[l[0][0]], _current=[l[0][0]])), key=len, reverse=True)
  return [a for i, a in enumerate(result) if all(any(c not in b for c in a) for b in result[:i])]

print(get_result(list_a))

输出:

[['42', '43', '46', '45', '44'], ['47', '48', '51', '50', '49']]