Как объединить элементы этих списков? - PullRequest
0 голосов
/ 25 февраля 2019

Учитывая следующее 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 голосов
/ 25 февраля 2019

Вы можете использовать рекурсию с генератором:

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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...