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