Julia编程 - 从集

时间:2017-06-19 08:02:43

标签: tuples julia

我有一套S = {1,2,3}。我正在尝试创建一个形式(i,j,1)的元组,其中i和j是S的元素。当S = {1,2,3}时,我的元组(比如说E)应该是{ (1,2,1),(2,1,1),(1,3,1),(3,1,1),(3,2,1),(2,3,1)}。我尝试了以下方式。

    for i in S
      for j in S
        E = Set()
        E = [(i,j,1),(j,i,1), i!=j]
        print(E)
      end
    end

但它没有给我所需的结果。我得到的是

  

不限[(2,2,1),(2,2,1),假]任何[(2,3,1),(3,2,1),真]任何[(2,1, 1),(1,2,1),真]任何[(3,2,1),(2,3,1),真]任何[(3,3,1),(3,3,1) ,假]任何[(3,1,1),(1,3,1),真]任何[(1,2,1),(2,1,1),真]任何[(1,3-, 1),(3,1,1),真]任何[(1,1,1),(1,1,1),假]

有人可以帮助我获得所需的结果吗?

2 个答案:

答案 0 :(得分:6)

您可以使用list comprehension

实现您想要的效果
[(i,j,1) for i in S for j in S if i != j]

请注意,这会为您提供一个数组,但您可以将其传递给一个set构造函数;或者你可以使用' generator'直接:

Set( (i,j,1) for i in S for j in S if i != j )

虽然我做错了什么?

这部分代码:

E = Set()
E = [(i,j,1),(j,i,1), i!=j]

没有做你认为的事情。我认为您打算E进行实例化'作为一套'对象,你当时希望"追加"元素由"分配"他们到E.(同样,还有你为什么期望一个普通元素作为选择测试的问题,但无论如何)。

但显然这不起作用,因为每次分配给E时,您都会用[引用] a <替换其先前的内容em> new object。

如果您想仔细阅读并附上&#39;你想要的元素一个接一个, 是可能的,但你应该这样做:

E = Set()
for i in S, j in S
  if i != j
    push!(E, (i,j,1), (j,i,1));
  end
end

(另请注意julia的特殊&#39;嵌套for循环&#39;语法)

答案 1 :(得分:3)

更通用的解决方案可能是:

julia> [(first(i)..., last(i)...) for i in Base.product(permutations(1:4, 3), [(5,6)])]
24×1 Array{Tuple{Int64,Int64,Int64,Int64,Int64},2}:
 (1,2,3,5,6)
 (1,2,4,5,6)
 (1,3,2,5,6)
 (1,3,4,5,6)
 (1,4,2,5,6)
 (1,4,3,5,6)
 (2,1,3,5,6)
 (2,1,4,5,6)
 (2,3,1,5,6)
 (2,3,4,5,6)
 (2,4,1,5,6)
 (2,4,3,5,6)
 (3,1,2,5,6)
 (3,1,4,5,6)
 (3,2,1,5,6)
 (3,2,4,5,6)
 (3,4,1,5,6)
 (3,4,2,5,6)
 (4,1,2,5,6)
 (4,1,3,5,6)
 (4,2,1,5,6)
 (4,2,3,5,6)
 (4,3,1,5,6)
 (4,3,2,5,6)