Python根据给定的键组合2个列表
我正在处理一个问题,这里是输入Python根据给定的键组合2个列表,python,list,Python,List,我正在处理一个问题,这里是输入 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']] 并转化为 o
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
输出中有一些额外的列表,如果列表2或列表3太大,运行itertools.permutations将花费大量时间,因此我正在寻找另一种方法来解决此问题。好的,这有点长,请耐心等待。第一步是构建一个字典,将字母转换为带数字的字母,即
a
到A12
,等等
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
次,其中n
是list1
的大小,对于示例数据集等于120。这可能会在超大数据集上运行一段时间(这是这类问题的本质),但只会随着需要进行的替换数量而增大,而不是整个数据集的大小。请说明您迄今为止尝试了什么!如何将这两个列表转换为输出1
?在list1
中的重复元素之前追加list2
元素的每个组合?它看起来几乎是随机的。我试图使用itertools.permutations,并将此函数应用于一个新的list3=['12','14','0','0','0'],然后获得不同的组合,然后组合list1和lists中的每个元素,如果键中的list1[I]+list3[I],那么我将list1[I]转换为键中的值。问题是,如果列表的数量太大,运行itertools.permutations将花费大量时间,因此我正在寻找其他方法来完成此操作。@Ningxi:发布您当前的代码。你能多加些背景吗?您的输入和输出似乎几乎完全不相关。在组合list1和list2以达到输出1时,您是否使用了特定的模式?做得好,我没有考虑对索引进行分组。。。是的,我意识到我的代码会运行n!时间到了,但这是我目前的解决方案。。非常感谢。