Как мне объединить в один подсписок два подсписка с одинаковым индексом 0? - PullRequest
0 голосов
/ 13 ноября 2018

Это не то же самое, что сведение списка.

У меня есть этот список списков:

listoflists = [[853, 'na'], [854, [1, 2, 3, 4, 5]], [854, [2, 4, 6, 8]]

Я хочу, чтобы те списки, которые имеют одинаковый индекс 0 (в данном случае 854), были объединены, но не сведены, например:

listoflists_v2 = [[853, 'na'], [854, [1, 2, 3, 4, 5], [2, 4, 6, 8]]]

Как мне это сделать?

Ответы [ 2 ]

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

Вот еще один способ сделать это, хотя я бы не рекомендовал это. Хорошо для обучения, я думаю.

# orginal list
listoflists = [[853, 'na'], [854, [1, 2, 3, 4, 5]], [854, [2, 4, 6, 8]]]
# new list with combined data
new_list = []

# loop through all sublists
for sub_list in listoflists:
    # check if new_list is empty to see if its data should be compared
    # with the orinal if not add sublist to new_list
    if new_list:
        # check all the lists in new_list
        for list_ in new_list:
            # if the list in new_list and one of the original lists
            # first element match, add the values of the original list
            # starting from the first elemnt to the new_list
            if sub_list[0] == list_[0]:
                list_.append(sub_list[1:])

            else:
                list_.append(sub_list)

    else:
        new_list.append(sub_list)

print(new_list)
0 голосов
/ 13 ноября 2018

Если важен порядок, используйте OrderedDict и собирайте значения для каждого ключа:

from collections import OrderedDict
d = OrderedDict()
for k, v in listoflists:
    d.setdefault(k, []).append(v)

listoflists_v2 = [[k, *v] for k, v in d.items()]

Если нет, используйте defaultdict, вы получите чуть лучшую производительность:

from collections import defaultdict
d = defaultdict(list)
for k, v in listoflists:
   d[k].append(v)

listoflists_v2 = [[k, *v] for k, v in d.items()]

Другой вариант использует itertools.groupby:

from itertools import groupby
from operator import itemgetter
listoflists.sort(key=itemgetter(0)) # Do this if keys aren't consecutive.

listoflists_v2 = [
    [k, *map(itemgetter(1), g)] 
    for k, g in groupby(listoflists, key=itemgetter(0))
]

print(listoflists_v2)
[[853, 'na'], [854, [1, 2, 3, 4, 5], [2, 4, 6, 8]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...