Python根据给定的键组合两个列表

2024-04-26 08:01:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个问题,这里是输入

list1 = ['A', 'U', 'C', 'C', 'A']
list2 = ['12', '14']
key = {'A12':'*', 'C14':'#'}

输出如下:

output1 = [['A12', 'U', 'C14', 'C', 'A'], ['A12', 'U', 'C', 'C14', 'A'],['A', 'U', 'C14', 'C', 'A12'], ['A', 'U', 'C', 'C14', 'A12']]

并转换为

output2 = [['*', 'U', '#', 'C', 'A'], ['*', 'U', 'C', '#', 'A'],['A', 'U', '#', 'C', '*'], ['A', 'U', 'C', '#', '*']]

我正在使用Python2.7来解决这个问题,但是我还没有弄明白。。。任何回答或建议将不胜感激!你知道吗

这是我的密码:

list1 = ['A', 'U', 'C', 'C', 'A']
list2 = ['12', '14']
key = {'A12':'*', 'C14':'#'}

list3 = ['12', '14', '0', '0','0'] #build by myself
combo = list(set(itertools.permutations(list3, len(list3))))
list_combo = []
for each_list in combo:
new_list = []
for i in xrange(len(list1)):
    if list1[i]+each_list[i] in key:
        new_list.append(key[list1[i]+each_list[i]])
    else:
        new_list.append(list1[i])
    list_combo.append(new_list)
print list_combo

输出中有一些额外的列表,如果list2或list3太大,则需要花费大量时间才能运行itertools.排列,所以我正在寻找另一种方法来解决这个问题。你知道吗


Tags: keyinnewforlenlisteachitertools
1条回答
网友
1楼 · 发布于 2024-04-26 08:01:18

好吧,这有点长,所以请容忍我。第一步是构造一个字典,将字母转换成带数字的字母,即AA12,等等

replacements = dict((k[0],k) for k in key.keys())
# replacements is equal to {'A': 'A12', 'C': 'C14'}

这样以后事情就简单多了。下一步是建立一个需要替换的所有指标的列表,并为每种类型的替换将这些指标分解为子列表。你知道吗

indicies = [[i for i,x in enumerate(list1) if x == k] for k in replacements.keys()]
# indicies is equal to [[0, 4], [2, 3]]

最后,我们在需要替换的索引列表上使用itertools.product,以获得每个可能的分组,然后将它们添加到必要的输出列表中:

output1 = []
output2 = []
for group in itertools.product(*indicies):
    l = []
    l2 = []
    for i in range(len(list1)):
        l.append(list1[i] if i not in group else replacements[list1[i]])
        l2.append(list1[i] if i not in group else key[replacements[list1[i]]])
    output1.append(l)
    output2.append(l2)
print output1
print output2

这给了我们想要的答案:

[['A12', 'U', 'C14', 'C', 'A'], ['A12', 'U', 'C', 'C14', 'A'], ['A', 'U', 'C14', 'C', 'A12'], ['A', 'U', 'C', 'C14', 'A12']]
[['*', 'U', '#', 'C', 'A'], ['*', 'U', 'C', '#', 'A'], ['A', 'U', '#', 'C', '*'], ['A', 'U', 'C', '#', '*']]

这段代码和您正在运行的代码之间的一个主要区别是,我的代码只运行它所需要的迭代次数,所以在示例数据集中,只运行4次。您的代码似乎至少运行了某些部分n!次,其中nlist1的大小,对于示例数据集等于120。这仍然可能在非常大的数据集上运行一段时间(这是这类问题的本质),但只会随着它必须进行的替换的数量而增大,而不是整个数据集的大小。你知道吗

相关问题 更多 >