给出对象列表,生成所有可能对的最佳方法是什么?
我尝试过的代码:
g.inject(1, 2, 3).project('a', 'b').by().by()
预期:
[
{'a': 1, 'b': 1},
{'a': 1, 'b': 2},
{'a': 1, 'b': 3},
{'a': 2, 'b': 1},
{'a': 2, 'b': 2},
{'a': 2, 'b': 3},
{'a': 3, 'b': 1},
{'a': 3, 'b': 2},
{'a': 3, 'b': 3},
]
实际:
[
{'a': 1, 'b': 1},
{'a': 2, 'b': 2},
{'a': 3, 'b': 3},
]
答案 0 :(得分:1)
这是我想到的第一种方法-如果有更直接的思考方式,这不会感到惊讶,但是:
gremlin> g.inject([1,2,3]).as('x').
......1> unfold().as('a').
......2> map(select('x').
......3> unfold().
......4> project('a','b').
......5> by(select('a')).
......6> by().
......7> fold()).
......8> unfold()
==>[a:1,b:1]
==>[a:1,b:2]
==>[a:1,b:3]
==>[a:2,b:1]
==>[a:2,b:2]
==>[a:2,b:3]
==>[a:3,b:1]
==>[a:3,b:2]
==>[a:3,b:3]
我猜想这种方法的“技巧”是将“ x”(即数字列表)重复两次,一次是“ a”,一次是“ b”。也许可以在repeat()
上下文中更好地理解循环语义:
gremlin> g.inject([1,2,3]).as('x').
......1> unfold().as('a').
......2> repeat(select('x').
......3> unfold().
......4> project('a','b').
......5> by(select('a')).
......6> by()).
......7> times(1)
==>[a:1,b:1]
==>[a:1,b:2]
==>[a:1,b:3]
==>[a:2,b:1]
==>[a:2,b:2]
==>[a:2,b:3]
==>[a:3,b:1]
==>[a:3,b:2]
==>[a:3,b:3]
不确定该方法是否更清楚相同的意图。我想我更喜欢前者。完成输入后,我意识到所有这些都可以简化为:
gremlin> g.inject([1,2,3]).as('x').
......1> unfold().as('a').
......2> select('x').
......3> unfold().as('b').
......4> select('a','b')
==>[a:1,b:1]
==>[a:1,b:2]
==>[a:1,b:3]
==>[a:2,b:1]
==>[a:2,b:2]
==>[a:2,b:3]
==>[a:3,b:1]
==>[a:3,b:2]
==>[a:3,b:3]
很明显,我想说这最后的解决方案是最好,最容易阅读的。