我正在处理一个问题,这里是输入
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.排列,所以我正在寻找另一种方法来解决这个问题。你知道吗
好吧,这有点长,所以请容忍我。第一步是构造一个字典,将字母转换成带数字的字母,即
A
到A12
,等等这样以后事情就简单多了。下一步是建立一个需要替换的所有指标的列表,并为每种类型的替换将这些指标分解为子列表。你知道吗
最后,我们在需要替换的索引列表上使用
itertools.product
,以获得每个可能的分组,然后将它们添加到必要的输出列表中:这给了我们想要的答案:
这段代码和您正在运行的代码之间的一个主要区别是,我的代码只运行它所需要的迭代次数,所以在示例数据集中,只运行4次。您的代码似乎至少运行了某些部分
n!
次,其中n
是list1
的大小,对于示例数据集等于120。这仍然可能在非常大的数据集上运行一段时间(这是这类问题的本质),但只会随着它必须进行的替换的数量而增大,而不是整个数据集的大小。你知道吗相关问题 更多 >
编程相关推荐