Сравнение списка со списком списков - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть список string_array = ['1', '2', '3', '4', '5', '6'] и список списков multi_list = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]

Первый элемент каждого подсписка в multi_list будет иметь соответствующую запись в string_array.

(в списках не будет дубликатов элементов)

Как мне сопоставить эти связанные элементы в словарь, например:

{
'1': ['2'],
'2': ['3', '4'],
'3': [],
'4': ['5'],
'5': ['6'],
'6': []
}

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Вот несколько концепций, которые помогут вам, но я не собираюсь давать вам полное решение. Вы должны сделать это самостоятельно, чтобы погрузиться в понятия.

Чтобы создать пустой словарь списков

{
    '1': [],
    '2': [],
    '3': [],
    '4': [],
    '5': [],
    '6': [],
}

, вы можете использовать для l oop:

list_one = ['1', '2', '3', '4', '5', '6']

my_dict = {}
for value in list_one:
    my_dict[value] = []

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

my_dict = {value: [] for value in list_one}

Теперь вам нужно l oop над вторым списком и append к текущему списку. например, чтобы добавить в список, вы можете сделать это несколькими способами:

a = [1,2]
b = [3,4]
c = 5

# add a list to a list
a += b
# now a = [1,2,3,4]

# add a list to a list
b.append(c)
# now b = [3,4,5]

Чтобы разделить списки, вы можете использовать обозначение среза:

a = [1,2,3,4]
b = a[:2]
c = a[2:]
# now b = [1,2], and c = [3,4]

И получить доступ к элементу в словарь, вы можете сделать это так:

a = { '1': [1,2,3] }
a['1'] += [4,5,6]
# now a = { '1': [1,2,3,4,5,6] }
0 голосов
/ 25 февраля 2020
flat = ['1', '2', '3', '4', '5', '6']
nested = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]

result = {key: [] for key in flat}

for key in result:
    result[key] = [nest[1] for nest in nested if key == nest[0]]


#{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}

Используя элементы плоского списка в качестве ключей, вы можете создать словарь и использовать пустые списки в качестве значений. Пустые строки или None также будут работать, если использовать списки для генерации значений позже.

Затем просто переберите ключи в словаре и вашем вложенном списке, чтобы добавить результаты к соответствующим ключам.

Кроме того;

Вы можете уменьшить приведенное выше значение до одной строки, выводя тот же результат.

result = {key: [nest[1] for nest in nested if key == nest[0]] for key in flat}

Выход:

{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}

РЕДАКТИРОВАТЬ :

После оценки комментария Хуанпы и проверки эффективности приведенного выше кода становится ясно, что есть гораздо лучшие способы выполнить это при работе с большими наборами данных.

Комментарий для справки:

Это решение O (N * M), где N и M - размеры плоских и вложенных. Вы можете сделать это в O (MAX (N, M)). По сути, l oop над вложенным вместо result и для a, b во вложенном: result [a] .append (b)

Выполнение вышеуказанного кода 1000 раз с 1000 элементами в плоском списке и 1000 вложенных списков во вложенных .. время выполнения;

print(t.timeit(1000))
39.37227249999978

Однако запуск его с приведенным ниже кодом может похвастаться гораздо более эффективным временем выполнения.

print(j.timeit(1000))
0.17638869999973394

Код:

result = {key: [] for key in flat}
for a, b in nested:
    if a in result:
        result[a].append(b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...