Cross Concatenate Elements of 2 Vectors to Produce a Third

后端 未结 3 763
余生分开走
余生分开走 2021-01-23 06:38

I have 2 vectors and want to distribute one across the other to form a third vector like:

V1 = (a,b,c)
V2 = (d,e,f)

Result:

V3          


        
相关标签:
3条回答
  • 2021-01-23 06:53

    You do not make clear what operation ab means. I'll assume here you want to multiply two real numbers.

    In Python, you can use a comprehension. Here a complete code snippet.

    v1 = (2, 3, 5)
    v2 = (7, 11, 13)
    v3 = tuple(x * y for x in v1 for y in v2)
    

    The value for v3 is then

    (14, 22, 26, 21, 33, 39, 35, 55, 65)
    

    as wanted. If you want a Python list, the code looks easier: use

    v3 = [x * y for x in v1 for y in v2]
    

    It will be obvious how to change the operation to concatenation or anything else desired. Here is sample code for concatenation of strings:

    v1 = ('a', 'b', 'c')
    v2 = ('d', 'e', 'f')
    v3 = tuple(x + y for x in v1 for y in v2)
    

    which results in

    ('ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf')
    

    You could also use product() from the itertools module (which I used in the first version of this answer) but the above seems easier.

    0 讨论(0)
  • 2021-01-23 06:56

    In R:
    as.vector(sapply(V1, function(x) paste0(x, V2)))

    0 讨论(0)
  • 2021-01-23 06:56

    In C++:

    std::vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
    

    ...though, I usually would format it in multiple lines.

    As MCVE:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    template <typename ELEM>
    ostream& operator << (ostream &out, const vector<ELEM> &vec)
    {
      const char *sep = "{ ";
      for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
      return out << " }";
    }
    
    int main()
    {
      vector<double> v1{ 1.0, 2.0, 3.0 }, v2{ 4.0, 5.0, 6.0 };
      // in one line:
      vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
      // output:
      cout << v3 << endl;
      // done
      return 0;
    }
    

    Output:

    { 4, 5, 6, 8, 10, 12, 12, 15, 18 }
    

    (Tested on ideone.)

    Thanks, Rory Daulton, for the inspiration. In C++, I can do this also:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string operator*(const string &str1, const string &str2)
    {
      return str1 + str2;
    }
    
    template <typename ELEM>
    ostream& operator << (ostream &out, const vector<ELEM> &vec)
    {
      const char *sep = "{ ";
      for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
      return out << " }";
    }
    
    int main()
    {
      vector<string> v1{ "a", "b", "c" }, v2{ "d", "e", "f" };
      // in one line:
      vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
      // output:
      cout << v3 << endl;
      // done
      return 0;
    }
    

    Output:

    { ad, ae, af, bd, be, bf, cd, ce, cf }
    

    After a little improvement, it will even work for mixed types:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string operator*(const string &arg1, int arg2)
    {
      string ret; for (int i = 0; i < arg2; ++i) ret += arg1;
      return ret;
    }
    
    template <typename ELEM>
    ostream& operator << (ostream &out, const vector<ELEM> &vec)
    {
      const char *sep = "{ ";
      for (const ELEM &elem : vec) { out << sep << elem; sep = ", "; }
      return out << " }";
    }
    
    int main()
    {
      vector<string> v1{ "a", "b", "c" }; vector<int> v2{ 1, 2, 3 };
      // in one line:
      vector<decltype(v1.front() * v2.front())> v3 { v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2], v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2], v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2] };
      // output:
      cout << v3 << endl;
      // done
      return 0;
    }
    

    Output:

    { a, aa, aaa, b, bb, bbb, c, cc, ccc }
    
    0 讨论(0)
提交回复
热议问题