[英]Generate Unique Pairs From Two Lists Without Itertools
我在一个列表上循环了两次,想要捕获所有唯一的对,而不是所有的组合——即。 对中的顺序无关紧要
listy=[0,1,2]
out=[]
for i in listy:
for j in listy:
out.append([i,j])
我得到的输出是 [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0], [2,1],[2,2]]
我正在寻找的是 [[0,0],[0,1],[0,2],[1,1],[1,2],[2,2]]
一种可能的解决方案是,
listy=[0,1,2]
out=[]
for i in listy:
for j in listy:
pair=set([i,j])
if pair not in out:
out.append(pair)
这会产生 [{0},{0,1},{0,2},{1},{1,2},{2}]
但是,这会在繁重的脚本中造成效率低下(列表很长),而且我也不想要集合列表。 我想要一个列表列表。
有没有更好的方法可以在不使用 itertools 的情况下实现这一点(我想要一个实现,我也可以应用到 javascript 而无需太多重新思考)
一个微不足道的“修复”将是:
listy=[0,1,2]
out=set()
for i in listy:
for j in listy:
if (i, j) not in out and (j, i) not in out:
out.add((i,j))
结果是:
{(0, 1), (1, 2), (0, 0), (1, 1), (0, 2), (2, 2)}
然而,这不是一个有效的实现,因为我们必须检查两次元素是否在列表中。
您可以使用数组的简单扫描来实现您的目标:
listy=[0,1,2]
out = [(i, j) for i in range(len(listy)) for j in range(i, len(listy))]
注意:我对对使用元组,您可以使用以下方法轻松地将其更改为列表列表:
out = [[i, j] for i in range(len(listy)) for j in range(i, len(listy))]
我根本不懂javascript,但如果有类似于列表理解的东西,我会试试这个:
listy = [0,1,2]
pairs = [[i, j] for i in listy for j in listy if i <= j]
对的内容完全符合您的要求:
[[0, 0], [0, 1], [0, 2], [1, 1], [1, 2], [2, 2]]
直接从输入list
生成所需结果的itertools.combinations_with_replacement(listy, 2)
(匹配您想要的行为)的最直接翻译是:
listy = [0,1,2]
out = []
for idx, i in enumerate(listy):
for j in listy[idx:]:
out.append([i, j])
唯一的变化是使用enumerate
(在迭代时获取当前索引)并切片内部循环中使用的listy
(因此它从与外部循环的当前运行相同的索引开始)。
这以最小的开销获得了所请求的确切结果(它确实为每个内部循环制作了list
的浅表副本,大小减小了一次,但这在 Python 中相当快;除非list
很大,否则它应该是一个非常小的成本)。 如果您需要避免切片,您可以使内部循环成为带有索引的基于索引的循环(但在实践中,索引的开销足够高,以至于它经常会输给切片):
listy = [0,1,2]
out = []
for idx, i in enumerate(listy):
for idxj in range(idx, len(listy)):
out.append([i, j[idxj]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.