Переопределить элементы в сгенерированных комбинациях из одного списка в термины другого списка, чьи элементы позиционно связаны - PullRequest
0 голосов
/ 12 октября 2018

Список значений в списке stuff является ключом или соответствует словам в списке words.

stuff = [10170028,1,51,5,2,2,14,1,10,2,5,1,1]
words =['AGGGG','AUDIT + PARK','AUDIT + PENDING','AUDIT + QUOTE_CREATED'',AUDIT + QUOTE_DELETED',
         'AUDIT + QUOTE_REJECTED','AUDIT + QUOTE_UPDATED','AUDIT + RFQ_DELETED',
         'LIVE','PENDING','QUOTE_CREATED','REJECT','RFQ_DELETED']

Все элементы в stuff однозначно связаны с элементом в words по позиции, например 1 в index 1 связан с AUDIT + PARK, а 1 в index 7 связан с LIVE

Затем я использую itertools для получения каждогоуникальный список, равный определенной сумме:

new = []
for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        if sum(subset) == 10170090:
            new.append(subset)
for x in new:
    print(x)

Мой new список состоит из комбинаций

[(10170028, 1, 51, 10), (10170028, 51, 1, 10),...(10170028, 1, 51, 2, 1, 5, 1, 1), (10170028, 1, 51, 1, 2, 5, 1, 1)]  

Мне нужно преобразовать каждый элемент в этих подсписках в элемент, с которым они связаныв words

Ответы [ 4 ]

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

При создании ваших комбинаций вы можете включить индекс числа в список, чтобы вы знали, какое число (по определенному индексу) было позже (поскольку вы можете иметь дубликаты):

for L in range(0, len(stuff) + 1):
    # generate combinations of (index, number) tuples
    for subset in itertools.combinations(list(enumerate(stuff)), L): 
        if sum(x for i, x in subset) == 10170090:
            new.append(subset) # subset has index information

И теперь мы можем получить соответствующее слово для этого числа.Так что теперь это

for combo in new:
    print(combo)
    print([words[i] for i, x in combo]) # get word corresponding to index

отпечатки:

((0, 10170028), (1, 1), (2, 51), (8, 10))                                                                                             
['AGGGG', 'AUDIT + PARK', 'AUDIT + PENDING', 'PENDING']                                                                               
((0, 10170028), (2, 51), (7, 1), (8, 10))                                                                                             
['AGGGG', 'AUDIT + PENDING', 'LIVE', 'PENDING']                                                                                       
((0, 10170028), (2, 51), (8, 10), (11, 1))                                                                                            
['AGGGG', 'AUDIT + PENDING', 'PENDING', 'RFQ_DELETED']                                                                                
...
0 голосов
/ 13 октября 2018

Создайте словарь, отображая элементы из stuff в соответствующее слово из words, затем используйте понимание вложенного списка для замены элементов в new:

>>> d = dict(zip(stuff, words))
>>> [[d[x] for x in y] for y in new]
[['AGGGG', 'RFQ_DELETED', 'AUDIT + PENDING', 'PENDING'],
 ['AGGGG', 'AUDIT + PENDING', 'RFQ_DELETED', 'PENDING'],
 ...
0 голосов
/ 13 октября 2018

Поскольку у вас есть несколько индексов, которые соответствуют нескольким ключевым словам, и вы генерируете списки в new, которые находятся в последовательности, например, в шаблоне [1, 51] здесь 1 равно AUDIT_PARK, но в последовательностикак [51, 10, 1], 1 теперь представляет RFQ_DELETED.Вы можете использовать iter, чтобы пройти, как вы подходите, и двигаться вперед, или взять правильный word, который соответствует этому числу в его позиции в stuff.Я уверен, что это может быть очищено, но это работает правильно

new = []
for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        if sum(subset) == 10170090:
            new.append(subset)

new = list(map(list, new))

for i in new:
    lst = iter(list(zip(stuff, words)))
    a = next(lst)
    for idx, item in enumerate(i):
        while True:
            if item == a[0] and a[1] == 'RFQ_DELETED':
                i[idx] = a[1]
                break
            elif item == a[0]:
                i[idx] = a[1]
                a = next(lst)
                break
            else:
                a = next(lst)

print(new)

[['AGGGG', 'AUDIT + PARK', 'AUDIT + PENDING', 'PENDING'], 
 ['AGGGG', 'AUDIT + PENDING', 'LIVE', 'PENDING'], 
 ['AGGGG', 'AUDIT + PENDING', 'PENDING', 'RFQ_DELETED'], 
 ['AGGGG', 'AUDIT + PARK', 'AUDIT + PENDING', 'AUDIT + QUOTE_CREATED,AUDIT + QUOTE_DELETED', 'REJECT'], 
 ['AGGGG', 'AUDIT + PENDING', 'AUDIT + QUOTE_CREATED,AUDIT + QUOTE_DELETED', 'LIVE', 'REJECT'],  
 ... 
 ['AGGGG', 'AUDIT + PENDING', 'AUDIT + QUOTE_CREATED,AUDIT + QUOTE_DELETED', 'AUDIT + QUOTE_REJECTED', 'LIVE', 'QUOTE_CREATED', 'RFQ_DELETED'], 
 ['AGGGG', 'AUDIT + PENDING', 'AUDIT + QUOTE_REJECTED', 'AUDIT + QUOTE_UPDATED', 'LIVE', 'REJECT', 'RFQ_DELETED'], 
 ['AGGGG', 'AUDIT + PENDING', 'AUDIT + QUOTE_REJECTED', 'LIVE', 'QUOTE_CREATED', 'REJECT', 'RFQ_DELETED'], 
 ['AGGGG', 'AUDIT + PENDING', 'AUDIT + QUOTE_REJECTED', 'LIVE', 'QUOTE_CREATED', 'REJECT', 'RFQ_DELETED']
]
0 голосов
/ 13 октября 2018

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

for id, val in enumerate(stuff):
    print(id, val, words[id])

или вы можете zip() это

print(list(zip(stuff, words)))
...