staging.inyokaproject.org

Merge Array

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

fireworker72

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Hallo Leute

Wie schaffe Ich es aus 2 Arrays eines zu machen?

Array1  Zeile 1 "Aussentemperatur"
Array2  Zeile 1 "15"

und in Array3 soll dann in Zeile 1 "Aussentemperatur 15" stehen

es gibt natürlich mehr Zeilen in jedem Array hab nur eine als Beispiel herrausgenommen

Danke für eure Mithilfe

Bearbeitet von rklm:

Codeblock. Bitte beachte Forum/Syntax!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wenn die Indices identisch sind, ginge das z.B. so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
array_1=(foo bar baz)
array_2=(1 2 3)

if [ ${#array_1[@]} -eq ${#array_2[@]} ]; then
    array_3=()
    for i in ${!array_1[@]}; do
        array_3[$i]="${array_1[$i]} ${array_2[$i]}"
    done
else
    echo "arrays have different numbers of elements!"
fi
printf "%s\n" "${array_3[@]}"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

fireworker72 schrieb:

Wie schaffe Ich es aus 2 Arrays eines zu machen?

Von welcher Programmiersprache sprechen wir denn?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Gaaaanz bestimmt von Io. 😉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env io

main := method(
    list_a := List with("foo", "bar", "baz")
    list_b := List with(1, 2, 3)
    
    (list_a size != list_b size) ifTrue(
        Exception raise("lists have different lengths")
    )
    list_c := list_a map(index, value, value .. " " .. list_b at (index))
    
    list_c println
)

isLaunchScript ifTrue(main)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Oder ein Einzeiler für Python 3.6 (da heißen die Arrays Listen, wenn sie beliebige Objekte beinhalten sollen dürfen):

1
combined_list = [f"{a} {b}" for a, b in zip(["foo", "bar", "baz"], [1,2,3])]

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Könnte natürlich auch CoffeeScript sein:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/env coffee
'use strict'
_ = require 'lodash'

main = ->
  as = ['foo', 'bar', 'baz']
  bs = [1, 2, 3]
  throw new Error 'arrays have different lengths' if as.length != bs.length
  cs = _.zipWith as, bs, (a, b) -> "#{a} #{b}"
  console.log cs

main() if require.main == module

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wenn die Daten bereits in 2 Variablen-Arrays stehen, reicht es die Elemente einfach hintereinander zu stellen: (ganz gleich in welcher Sprache)

1
2
3
for i in {1..17}; do
    echo "${array1[i]} ${array2[i]}"
done

Oder, wenn die Arrays in 2 Dateien stehen, einfach mit dem Shell-Befehl paste :

track@track:~$ echo "Innentemperatur
> Außentemperatur
> Wassertemperatur" > array1
track@track:~$ echo '15
> 8
> 27' > array2
track@track:~$ paste -d \  array1 array2
Innentemperatur 15
Außentemperatur 8
Wassertemperatur 27 

Falls die Lesart meiner Vorredner stimmen sollte, dass in jeder Zeile noch ein Index-Element davor steht, wird es ein Fall für merge .

War es das, was Du suchtest ?

LG,

track

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Es könnte natürlich auch C++ sein:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <algorithm>
#include <array>
#include <iostream>
#include <string>
using namespace std;

string f(string &s, int i) {
   return s + " " + to_string(i);
}

int main() {
   array<string, 3> as {{"foo", "bar", "baz"}};
   array<int, 3> bs {{1, 2, 3}};
   array<string, as.size()> cs;
   transform(as.begin(), as.end(), bs.begin(), cs.begin(), f);
   for (const auto& x: cs) {
      cout << x << endl;
   }
   return 0;
}

fireworker72

(Themenstarter)

Anmeldungsdatum:
11. März 2017

Beiträge: 64

Sorry

mit Bash

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

track schrieb:

Wenn die Daten bereits in 2 Variablen-Arrays stehen, reicht es die Elemente einfach hintereinander zu stellen: (ganz gleich in welcher Sprache)

👍

1
2
3
for i in {1..17}; do
    echo "${array1[i]} ${array2[i]}"
done

Achtung: der Index ist 0-basiert!

1
2
3
$ a=(foo bar)
$ echo "${a[1]}"
bar

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Ob das hintereinander ausgeben reicht hängt davon ab ob das reicht, würde ich sagen. ☺

Schade das es Bash ist, ich habe da noch so eine ”schöne” 4GL-Lösung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GLOBALS
DEFINE  as ARRAY[3] OF CHAR(5),
        bs ARRAY[3] OF INTEGER,
        cs ARRAY[3] OF CHAR(10),
        i INTEGER
END GLOBALS

MAIN
  LET as[1] = "foo"
  LET as[2] = "bar"
  LET as[3] = "baz"
  LET bs[1] = 1
  LET bs[2] = 2
  LET bs[3] = 3

  FOR i = 1 TO 3
    LET cs[i] = as[i] CLIPPED, " ", bs[i]
  END FOR

  FOR i = 1 TO 3
    DISPLAY cs[i]
  END FOR
END MAIN

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Wo wir schon mal dabei sind: Wir hatten auch noch keine Ruby-Lösung. Also:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Beispieldaten
a1 = 10.times.to_a
a2 = (11..20).to_a

# Merge 1
a3 = a1.zip(a2).each_with_object([]) {|(x,y),z| z << "#{x}-#{y}"}

# Merge 2
a3 = a1.zip(a2).inject([]) {|z, (x,y)| z << "#{x}-#{y}"}

# Merge 3
a3 = [].tap {|z| a1.zip(a2) {|x,y| z << "#{x}-#{y}"}}

# Ausgabe
p a3

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Haskell hatten wir auch noch nicht ☺

1
2
3
4
5
6
main :: IO ()
main =
  let xs = ["foo", "bar", "baz"]
      ys = [1..3]
      zs = [x ++ " " ++ show y | (x, y) <- zip xs ys]
  in putStr $ unlines zs

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

Perl hat bis jetzt auch gefehlt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/perl -w
# mergeArray.pl --- 

use warnings;
use strict;

my @array1 = qw! Aussentemperatur Innentemperatur Aussentemperatur !;
my @array2 = qw! 15 18 17 !;

foreach (0..$#array1) {
    print "$array1[$_] $array2[$_]\n";
}

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Habe keine Ahnung mehr, aber kann noch jemand Fortran77? - Wie sähe hier die Lösung aus? 😉

Antworten |