Как мне учесть повторение в элементах списка - PullRequest
0 голосов
/ 15 июня 2019

Задача родительской программы - генерировать перестановки и выяснять, с какой вероятностью они генерируются процессом генерации. Я хотел бы помочь в сортировке идентичных перестановок по списку.

Таким образом, каждый элемент в списке имеет форму [[[a,b,c],[x]],[[d,e,f],[y]],....], где x представляет вероятность, с которой [a,b,c] генерируется в одном цикле. У меня есть один из моих выходов ниже.

[[[1, 2, 3], [0.125]],[[1, 2, 3], [0.125]],[[2, 3, 1], [0.125]],[[2, 1, 3], [0.125]],[[3, 1, 2], [0.125]],[[1, 2, 3], [0.125]],[[1, 3, 2], [0.125]],[[1, 2, 3], [0.125]]] 

Когда мой окончательный список содержит [[a,b,c],[x]] и [[a,b,c],[y]], мне нужно, чтобы он стал [[a,b,c],[x+y]]. Как мне это сделать?

Я попробовал следующий код. Список вывода называется master_list.

for i in range(0,len(master_list)):
    count = []
    for j in range(i+1,len(master_list)):
        if master_list[i][0] == master_list[j][0]:
            count.append(j)
            master_list[i][1][0] += master_list[j][1][0]
        else:
            continue
    print('count for element',master_list[i][0], 'at number', i, 'is', count)
    for k in count:
        print(k)
        for c in range(0,len(count)):
            master_list.remove(master_list[k])
            print('master_list now is',master_list)
            count[c] += -1

Распечатки были только для меня, чтобы проверить. Однако проблема, с которой я столкнулся, заключалась в том, что после каждой операции .remove () индексы списков изменялись, поэтому цикл прерывался.

1 Ответ

0 голосов
/ 15 июня 2019

Вместо того, чтобы повторять исходный список, удаляя оттуда элемент (list.remove () равен O (n) [ref] ), более эффективный способ состоит в том, чтобы пройти через промежуточный словарь для последующего созданиясписок.

from collections import defaultdict

res = [[[1, 2, 3], [0.125]], [[1, 2, 3], [0.125]], [[2, 3, 1], [0.125]], [[2, 1, 3], [0.125]], [[3, 1, 2], [0.125]],
       [[1, 2, 3], [0.125]], [[1, 3, 2], [0.125]], [[1, 2, 3], [0.125]]]

grouped_res = defaultdict(float)
for perm, prob in res:
    grouped_res[tuple(perm)] += prob[0]


new_res = [[list(k), [v]] for k, v in grouped_res.items()]
# [[[1, 2, 3], [0.5]], [[2, 3, 1], [0.125]], [[2, 1, 3], [0.125]], [[3, 1, 2], [0.125]], [[1, 3, 2], [0.125]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...