Converting array to string implementing "and" only onto the last index - data-conversion

looked through the forum and only found the basics to converting arrays into strings. I'm looking to convert the array with commas and adds a final "and" to the last number
array = [1, 2, 3, 4]
=> array= "1, 2, 3, and 4"

Related

How to get sequence of items from list in Qore

Is there a Qore operator/function to get sublist from a list without modifying source list, i.e. equivalent of substr(). extract operator removes items from original list.
list l = (1,2,3,4,5,6,7,8,9);
list l2 = extract l, 2, 4;
printf("l:%y\nl2:%y\n", l, l2);
l:[1, 2, 7, 8, 9]
l2:[3, 4, 5, 6]
select operator supports in condition argument $# macro expanded as index.
list l = (1,2,3,4,5,6,7,8,9);
list l2 = select l, $# >= 2 && $# <2+4;
printf("l:%y\nl2:%y\n", l, l2);
l:[1, 2, 3, 4, 5, 6, 7, 8, 9]
l2:[3, 4, 5, 6]
The select operator is the best solution as you stated in your answer to your own question.
The splice and extract operators both will modify the list operand, which is not what you want.
Note that there is an outstanding feature issue for this in Qore (1781) - not yet targeted to a release, but it could go in the next major release (0.8.13) if there is any interest.

neo4j cypher delete permutations in collection

I've a query in Neo4j/Cypher which returns a collection like that:
MATCH z = (a:X)-[b:Y*2..]->(a)
RETURN relationships(z)
It returns (the paths) respectively the names of the edges:
[name 1, name 2, name 3, name 5],
[name 2, name 3, name 5, name 1],
[name 3, name 5, name 1, name 2],
[name 5, name 1, name 2, name 3],
[name 6, name 7],
[name 7, name 6],
[name 4, name 8],
[name 8, name 4]
In the result above the first 4 rows are equal, then the next two are equal and the last two rows are equal. I want to have no permutations like above i want something like that:
[name 1, name 2, name 3, name 5],
[name 6, name 7],
[name 4, name 8]
Does someone know how I would solve the problem?
Thanks in advance ;)
Cypher does not have a direct way to sort a collection. But there's a way to do it: use UNWIND followed by a WITH ... ORDER BY for sorting on a row level and use collect() to aggregate again.
Your case is even more complex since you want to partially order things on a pre-path base. First you need to build a kind of hashsum for each path (we're here concating relationship's ids) then do the unwind followed by order by and a collect based on the hash calculated previously.
I assume you want to use id of your relationship for ordering.
MATCH z = (a:X)-[b:Y*2..]->(a)
WITH relationships(z) as rels,
reduce(s="", x in relationships(z) | s+x+"_") as hash
UNWIND rels as r
WITH hash, id(r) as r_id order by hash, r_id
WITH hash, collect(r_id) as sorted_r_id
RETURN distinct sorted_r_id

How to remove\replace big bracket while printing List or array in groovy?

I have to give list of values into in clause of SQL query but while retrieving the values [ ] also come along with data which is not readable by query language.
For example I have list as:
def val = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8))
while doing println(val) output come as [1, 2, 3, 4, 5, 6, 7, 8] but in the query it is needed as: 1, 2, 3, 4, 5, 6, 7, 8
In java this one works as System.out.println(val.toString().replaceAll("[\\[\\]]", "")) but not in groovy. Can't we use collection to remove like this?
Instead of:
def val = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8))
use:
def val = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8)).join(', ')
or simply:
def val = [1,2,3,4,5,6,7,8].join(', ')
Try using g-strings and the minus operator:
println "${val}" - '[' - ']'

Computer science map and exclude

I have an array with some values:
[1, 2, 3, 4]
I'd like to make a new array that contains mapped version of the items in the array above, but only add them to the new array if they pass a truth test.
A combination of map and filter?
[1, 2, 3, 4].mapFilter(function(n) { if (n > 2) return n * 3 })
What is this called?
This is map composed with filter. It doesn't need a name.
map (*3) . filter (>2)

Indexing an array with a tuple

Suppose I have a tuple of (1, 2, 3) and want to index a multidimensional array with it such as:
index = (1, 2, 3)
table[index] = 42 # behaves like table[1][2][3]
index has an unknown number of dimensions, so I can't do:
table[index[0]][index[1]][index[2]]
I know I could do something like this:
functools.reduce(lambda x, y: x[y], index, table)
but it's utterly ugly (and maybe also inefficient), so I wonder if there's a better, more Pythonic choice.
EDIT: Maybe a simple loop is best choice:
elem = table
for i in index:
elem = elem[i]
EDIT2: Actually, there's a problem with both solutions: I can't assign a value to the indexed array :-(, back to ugly:
elem = table
for i in index[:-1]:
elem = elem[i]
elem[index[-1]] = 42
The question is very interesting and also your suggested solution looks good (havn't checked it, but this kind of problem requires a recursive treatment and you just did it in one line).
However, the pythonic way I use in my programs is to use dictionaries of tuples. The syntax is array-like, the performance - of a dictionary, and there was no problem in it for me.
For example:
a = {(1, 2, 3): 'A', (3, 4, 5): 'B', (5, 6, 7, 8): 'C'}
print a[1, 2, 3]
print a[5, 6, 7, 8]
Will output:
A
B
And assigning to an index is super easy:
a[1, 4, 5] = 42. (But you might want to first check that (1, 4, 5) is within the dict, or else it will be created by the assignment)

Resources