给出以下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]
就像将某些线段连接到多线段一样。
答案 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']]