如何解决Python函数仅通过交换相同的索引来返回列表列表
我有两个包含 5 个元素的列表。我想使用 itertools 或 python 代码返回由列表的所有排列组成的 5 个元素的列表,只需交换具有相同索引的两个列表的元素。
例如,如果 A = [1,2,3,4,5]
和 B = [a,b,c,d,e]
,我希望它返回以下列表列表,C:
没有 A
的元素被 B
替换的情况:
[1,5]
A
中的所有索引都被 B
替换的情况:
[a,e]
只有 A
中的一个元素被具有匹配索引的 B
中的元素替换的情况:
[a,5]
[1,e]
A
中的两个元素被具有匹配索引的 B
中的元素替换的情况(注意:这可以是任意两个元素,这两个元素不必相邻):
[a,5]
[1,5]
……等等……
[a,e]
[1,5]
……等等……
替换 3 个元素的情况(同样,这可以是任何 3 个元素):
[a,5]
……等等……
替换 4 个元素的情况(任何 4 个元素):
[a,5]
[a,e]
[a,e]
...等...
我认为使用 itertools 会很简单,但在创建此列表列表时遇到了问题。
解决方法
这是一个单班轮来做到这一点:
from itertools import product
A = [1,2,3,4,5]
B = ['a','b','c','d','e']
n = len(A)
out = [[(A if x[i] else B)[i] for i in range(n)] for x in product([0,1],repeat=n)]
或者(稍微)更pythonic:
out = [[(A if y else B)[i] for i,y in enumerate(x)] for x in product([0,repeat=n)]
说明:
x
涵盖了在 i
或 A
中选择第 B
个元素的所有可能性。
如果这对您来说太神秘了,那么这是扩展版本:
out = []
for x in product([0,repeat=n):
l = []
for i in range(n):
if x[i]:
l.append(A[i])
else:
l.append(B[i])
out.append(l)
,
如果我拿你的例子而忽略排列这个词,那么你想要的是一个迭代器,它执行以下操作:给定两个长度相等的列表作为输入,它返回一堆列表,其中第一个列表的元素被第二个列表的对应元素替换;并且要替换的元素的索引都是可能索引的长度-N个组合。
可能是带有生成器函数或迭代器类的东西...
def get_list_replacement_combinations(list_a,list_b):
# skipping some checks,like lists having same length
N = len(list_a)
for num_replaced_items in range(N+1):
new_list = list(list_a) # make a copy so we don't mess up the original
for combination in itertools.combinations(range(N),r=num_replaced_items):
for index in combination:
new_list[index] = list_b[index]
yield new_list
我是即时编造的,没有对其进行测试,因此可能存在错误,但这绝对是一般的想法。可能会弄乱替换项目的“长度为 0”的情况...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。