Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python根据给定的键组合2个列表_Python_List - Fatal编程技术网

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!时间到了,但这是我目前的解决方案。。非常感谢。