Python 将一个列表中生成的组合中的项重新定义为另一个列表的项,该列表的项按位置链接

Python 将一个列表中生成的组合中的项重新定义为另一个列表的项,该列表的项按位置链接,python,python-3.x,list,itertools,Python,Python 3.x,List,Itertools,列表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_DEL

列表
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
at
索引1
链接到
AUDIT+PARK
,而
1
at
索引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)
我的<代码>新建列表由组合组成

[(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

中链接到的项目。您可以使用索引

for id, val in enumerate(stuff):
    print(id, val, words[id])
或者你可以
zip()
it

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

创建一个字典,将
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'],
 ...

由于您有多个索引,对应于多个关键字,并且您在
new
中按顺序生成列表,例如,在模式
[1,51]
中,这里
1
等于
AUDIT\u PARK
,但顺序类似于
[51,10,1]
1
现在表示
RFQ\u已删除
。您可以使用
iter
进行匹配,并向前移动,以在
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']
]

生成组合时,您可以在列表中包含该编号的索引,以便知道该编号(在特定索引处)稍后是哪个编号(因为您可以有重复编号):

现在我们可以得到这个数字对应的单词。那么现在这个

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']                                                                                
...

我建议你看一下字典。怎样
1
能同时对应4个不同的字符串?请把问题弄清楚。您需要正确解释“stuff
中的值是键还是对应于
Word
中的单词”。值
1
2
5
如何分别对应多个不同的单词?
value
只是键值的总和吗?有些值是零还是负?澄清这一点很重要,因为多对一关系限制了dict在解决方案中的使用。此外,它还有助于计算出最大值,因此我们可以进行间隔搜索。但您的列表长度不匹配,因此您必须考虑that@vash_the_stampede在任何情况下,他都不能使用
列表
。。。因此,他有办法构建他想要的数据结构。e、 g.一本字典。但是
1
可以引用“words”中的各种项目非常好。在我经历了所有的麻烦之后,我意识到当OP创建组合并走这条路线时,我应该回去压缩索引,但我在使用iter的过程中玩得很开心,干得好!
((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']                                                                                
...