Удаление элементов из списка словарей и добавление их обратно - PullRequest
0 голосов
/ 07 мая 2019

Предположим, у нас есть список словарей:

[{0: [0, 1, 2, 3], 1: [4]}, {2: [5, 6, 7, 8], 3: [9]}, {4: [10, 11, 12]}]

, и мы хотим разбить словари в этом списке в соответствии с некоторым набором, например (0, 5, 10), таким образом, чтобы для каждого ihзначение в кортеже, если это значение присутствует в любом внутреннем подсписке i-го словаря, оно разделяется на свой собственный список.Кроме того, словари непрерывно перенумеровываются с 0. Таким образом, результат вышеупомянутого будет.

[{0:[0], 1: [1, 2, 3], 2: [4]}, {3:[5], 4: [6, 7, 8], 5: [9]}, {6:[10], 7: [11, 12]}]

, поскольку 0 является частью первого словаря, он получитТрещина.Поскольку 5 является частью второго словаря, он будет разделен.Точно так же, поскольку 10 является третьим значением в кортеже и является частью третьего словаря, оно будет разделено.

Я написал следующий код:

for i in range(0, len(newlist)):
    for key, value in newlist[i].items():
        if x[i] in value:
            value.remove(x[i])
        newlist[i][key].append(x[i])

Это дает [{0: [1, 2, 3, 0], 1: [4, 0]}, {2: [6, 7, 8, 5], 3: [9, 5]}, {4: [11, 12, 10]}], который не является желаемым выводом, он добавляет к каждому списку для ключа.

Как добавить просто один список, как в желаемом выводе, и как изменить нумерацию списков по своему усмотрению, используя понимание списка или иным образом?

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Вы можете использовать унифицированный индекс idx, чтобы отслеживать текущий номер ключа в dict, собирать все разделенные компоненты и объединять их в новый dict.
Я изменил ваш пример ввода, чтобы показать более сложную ситуацию.

newlist = [{0: [0, 1, 2], 1: [3]}, {2: [4, 5, 6, 7, 8], 3: [9]}, {4: [10], 5:[11, 12]}]
x = [0, 5, 10]

for l in newlist:
    components = []
    for key, value in sorted(l.items()):  # sort items because the storage of dict is unordered
        for split_val in x:
            if split_val in value:  # split the list if in value
                index = value.index(split_val)
                components += [value[:index], [split_val], value[index + 1:]]
                break
        else:
            components.append(value)

    cur_dict = {}
    for component in components:
        if component:   # only add non-empty component
            cur_dict[idx] = component
            idx += 1
    result.append(cur_dict)

выход:

[{0: [0], 1: [1, 2], 2: [3]}, {3: [4], 4: [5], 5: [6, 7, 8], 6: [9]}, {7: [10], 8: [11, 12]}]
2 голосов
/ 07 мая 2019

Мне удалось получить комбинированный словарь, используя следующую логику

li = [{0: [0, 1, 2, 3], 1: [4]}, {2: [5, 6, 7, 8], 3: [9]}, {4: [10, 11, 12]}]

values_list =  []
#Iterate through values of all dictionaries and join them end to end
for dct in li:
    values_list.extend(dct.values())

print(values_list)
#[[0, 1, 2, 3], [4], [5, 6, 7, 8], [9], [10, 11, 12]]
dct = {}
idx = 0

#Iterate through the list
for item in values_list:
    #If we have more then one item in the list, idx goes to first item, idx+1 goes to rest, idx gets incremented by 2
    if len(item) > 1:
        dct[idx] = [item[0]]
        dct[idx+1] = item[1:]
        idx+=2
    # If we have one item in the list, idx goes to first item, idx gets incremented by 1
    else:
        dct[idx] = [item[0]]
        idx+=1

print(dct)
#{0: [0], 1: [1, 2, 3], 2: [4], 3: [5], 4: [6, 7, 8], 5: [9], 6: [10], 7: [11, 12]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...