我有一个包含3个值的列表,其中两个是字符串。另一个列表,其中包含替换字符串的值:
li = [1, 'a', 'b']
li2 = [2, 3, 4]
我的想法是我可以用第二个列表替换字符串并在其上调用itertools.combinations()
:
li = [li2 if isinstance(x, str) else x for x in li]
li = [1, [2, 3, 4], [2, 3, 4]]
combo = list(itertools.combinations(li, 3)
但它只是给了我一个相同列表的元组。我想要的是[1, 2, 3], [1, 2, 4], [1, 3, 4]
之类的东西。我也尝试了排列,但它没有帮助。如何从两个列表中获取值的所有组合,从第一个列表中保留值?
答案 0 :(得分:3)
import itertools
li = [1, 'a', 'b']
li2 = [2, 3, 4]
def combinations_letters(li, li2):
li = list(li)
indexes = [i for i, x in enumerate(li) if isinstance(x, str)]
for comb in itertools.combinations(li2, r=len(indexes)):
for index, c in zip(indexes, comb):
li[index] = c
yield tuple(li)
print list(combinations_letters(li, li2))
输出:
[(1, 2, 3), (1, 2, 4), (1, 3, 4)]
这样做是找到li
中所有字符串的索引,并将其替换为itertools.permutations
的输出。
答案 1 :(得分:0)
这都是关于理解算法的。听起来像你有一个第一个列表,其中包含一些数字和一些字母,第二个列表的数字比第一个列表中的字母多。然后你必须通过第一个列表中的字母替换第二个列表中那么多数字的所有可能组合。这听起来像是你要解决的问题。如果你解决了这个问题,那么第一个列表中有多少个字母或数字并不重要,只要第二个列表中的数字多于第一个中的字母。
您需要做的第一件事就是看第一个列表中有多少个字母。这将是您从第二个列表中提取的组合的长度。然后,一旦您从第二个列表生成了所有可能组合的列表,您将浏览第一个列表,进行必要的替换。
如果这样做,那么您的代码将能够处理任何输入更改。