Печать нового списка с существующим списком - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел бы взять список, подобный этому: ['5', '0 1', '1 2', '1 8', '2 3'] и вернуть новый список, составленный из кортежей, например: [ (0, [1]), (1, [0,2,8]), (2 [1,3]), (3, [2]), (8, [1])]. Первый элемент каждого кортежа представляет собой целое число, а второй элемент представляет собой список целых чисел, рядом с которым он отображается в исходном списке. Я не могу использовать словари, наборы, deque, модуль bisect.

def create_network(file_name):
    friends = open(file_name).read().splitlines()
    network=[]

    for strings in friends:
        relationship=strings.strip().split(' ')
        if len(relationship)==2:
             a,b=relationship
             a=int(a)
             b=int(b)
             if a>=len(network):
                 network.append((a,[b]))
             else:
                 wow=network[a]
                 wow[1].append(b)
                 network[a]=wow


    return network

Это то, что я имею до сих пор. Я хочу это вернуть: [(0, [1, 2, 3]), (1, [0, 4, 6, 7, 9]), (2, [0, 3, 6, 8, 9]), (3, [0 , 2, 8, 9]), (4, [1, 6, 7, 8]), (5, [9]), (6, [1, 2, 4, 8])), (7, [1 , 4, 8]), (8, [2, 3, 4, 6, 7]), (9, [1, 2, 3, 5])], но возвращается [(0, [1, 2, 3]), (1, [4, 6, 7, 9]), (2, [3, 6, 8, 9]), (3, [8, 9]) , (4, [6, 7, 8]), (5, [9]), (6, [8]), (7, [8])]. Я не знаю, почему это не работает.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

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

d = ['5', '0 1', '1 2', '1 8', '2 3']
def find_edges(_d, c):
  return [(a if b == c else b) for a, b in _d if c in [a, b]]

new_d = [[int(c) for c in i.split()] for i in d if len(i) > 1]
_final = []
for i in [h for d in new_d for h in d]:
   if not any(j == i for j, _ in _final):
      _final.append((i, find_edges(new_d, i)))

Выход:

[(0, [1]), (1, [0, 2, 8]), (2, [1, 3]), (8, [1]), (3, [2])]
0 голосов
/ 11 ноября 2018

Вы можете сделать что-то вроде этого:

from itertools import combinations


def create_network(lst):
    seen = {}

    for e in lst:
        for s, t in combinations(map(int, e.split()), 2):
            seen.setdefault(s, set()).add(t)
            seen.setdefault(t, set()).add(s)

    return [(k, sorted(values)) for k, values in seen.items()]


data = ['5', '0 1', '1 2', '1 8', '2 3']
result = create_network(data)

print(result)

выход

[(0, [1]), (1, [0, 2, 8]), (2, [1, 3]), (3, [2]), (8, [1])]

Общая идея - создать словарь, в котором ключи - это целые числа, а значения - это набор целых чисел. к. Оператор map(int, e.split()) создает итерацию целых чисел, затем с помощью комбинаций выбирает каждую возможную пару из итерируемой, добавьте каждую пару в словарь и, наконец, верните кортежи, в которых отсортированы значения.

ОБНОВЛЕНИЕ (без использования встроенного модуля)

def combinations(m, lst):
    if m == 0:
        return [[]]
    return [[x] + suffix for i, x in enumerate(lst) for suffix in combinations(m - 1, lst[i + 1:])]


def create_network(lst):
    uniques = []
    for s in lst:
        for e in map(int, s.split()):
            if e not in uniques:
                uniques.append(e)

    result = []
    for number in uniques:
        seen = []
        for e in lst:
            values = list(map(int, e.split()))
            for s, t in combinations(2, values):
                if s == number:
                    if t not in seen:
                        seen.append(t)
                elif t == number:
                    if s not in seen:
                        seen.append(s)
        if seen:
            result.append((number, sorted(seen)))

    return sorted(result)


data = ['5', '0 1', '1 2', '1 8', '2 3']
network = create_network(data)
print(network)

выход

[(0, [1]), (1, [0, 2, 8]), (2, [1, 3]), (3, [2]), (8, [1])]

Приведенный выше код не использует набор, словарь или какой-либо внешний модуль. Имейте в виду, что это может быть медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...