Loading ...
Sorry, an error occurred while loading the content.
 

from lines to dict keys

Expand Messages
  • Marc Chantreux
    hello guys, i want each lines of the output of a shell command to become a key of a dict. I wote this code: let t = {} for k in split( system( echo foo; echo
    Message 1 of 14 , Nov 9, 2009
      hello guys,

      i want each lines of the output of a shell command to become a key of a
      dict. I wote this code:

      let t = {}
      for k in split( system("echo foo; echo bar "), '\n' )
      let t[k] = 1
      endfor

      but i don't like it: as the loop is here to populate the dictionnary, i
      would like to use something more appropriate. In perl for exemple, the
      map function enables you to write

      my %a = map { $_ => 1 } split /\n/, qx< echo foo; echo bar>

      vim has the equivalent of $_: it's called v:val, so i tried to use map
      or filter with attempts looking like that:

      let t = map( split( system("echo foo; echo bar "), '\n' ), { v:val : 1 } )

      and yet i just wonder if it's possible.

      regards,
      marc

      --~--~---------~--~----~------------~-------~--~----~
      You received this message from the "vim_use" maillist.
      For more information, visit http://www.vim.org/maillist.php
      -~----------~----~----~----~------~----~------~--~---
    • Andy Wokula
      ... -- Andy --~--~---------~--~----~------------~-------~--~----~ You received this message from the vim_use maillist. For more information, visit
      Message 2 of 14 , Nov 9, 2009
        Marc Chantreux schrieb:
        > hello guys,
        >
        > i want each lines of the output of a shell command to become a key of a
        > dict. I wote this code:
        >
        > let t = {}
        > for k in split( system("echo foo; echo bar "), '\n' )
        > let t[k] = 1
        > endfor
        >
        > but i don't like it: as the loop is here to populate the dictionnary, i
        > would like to use something more appropriate. In perl for exemple, the
        > map function enables you to write
        >
        > my %a = map { $_ => 1 } split /\n/, qx< echo foo; echo bar>
        >
        > vim has the equivalent of $_: it's called v:val, so i tried to use map
        > or filter with attempts looking like that:
        >
        > let t = map( split( system("echo foo; echo bar "), '\n' ), { v:val : 1 } )
        >
        > and yet i just wonder if it's possible.
        >
        > regards,
        > marc

        It is possible, the second argument to map() must be a string:
        :h map()
        :let t = map(["foo", "bar"], '{v:val : 1}')

        --
        Andy

        --~--~---------~--~----~------------~-------~--~----~
        You received this message from the "vim_use" maillist.
        For more information, visit http://www.vim.org/maillist.php
        -~----------~----~----~----~------~----~------~--~---
      • Marc Chantreux
        hello Andy and thanks for reply. ... i tried this solution but the result is [{ foo : 1}, { bar : 1}] when i expect { foo : 1, bar : 1 } regards marc
        Message 3 of 14 , Nov 9, 2009
          hello Andy and thanks for reply.

          On Mon, Nov 09, 2009 at 06:33:24PM +0100, Andy Wokula wrote:
          > It is possible, the second argument to map() must be a string:
          > :h map()
          > :let t = map(["foo", "bar"], '{v:val : 1}')

          i tried this solution but the result is

          [{'foo': 1}, {'bar': 1}]

          when i expect

          {'foo': 1, 'bar': 1 }

          regards

          marc

          --~--~---------~--~----~------------~-------~--~----~
          You received this message from the "vim_use" maillist.
          For more information, visit http://www.vim.org/maillist.php
          -~----------~----~----~----~------~----~------~--~---
        • Andy Wokula
          ... Sorry, I didn t understand (dunno Perl). I think you can t do it so nicely in Vim, but you can try the following: helper to keep the list unchanged (not
          Message 4 of 14 , Nov 10, 2009
            Marc Chantreux schrieb:
            > hello Andy and thanks for reply.
            >
            > On Mon, Nov 09, 2009 at 06:33:24PM +0100, Andy Wokula wrote:
            >> It is possible, the second argument to map() must be a string:
            >> :h map()
            >> :let t = map(["foo", "bar"], '{v:val : 1}')
            >
            > i tried this solution but the result is
            >
            > [{'foo': 1}, {'bar': 1}]
            >
            > when i expect
            >
            > {'foo': 1, 'bar': 1 }
            >
            > regards
            >
            > marc

            Sorry, I didn't understand (dunno Perl).
            I think you can't do it so nicely in Vim, but you can try the
            following:

            " helper to keep the list unchanged (not required):
            func! KeepVal(_)
            return v:val
            endfunc

            let in_list = ["foo", "bar"]
            let out_dict = {}
            call map(in_list, 'KeepVal(extend(out_dict, {v:val : 1}))')

            " not so nice:
            " - extra command for initialising out_dict
            " - return value of map() is useless here

            --
            Andy

            --~--~---------~--~----~------------~-------~--~----~
            You received this message from the "vim_use" maillist.
            For more information, visit http://www.vim.org/maillist.php
            -~----------~----~----~----~------~----~------~--~---
          • Christian Brabandt
            ... regards, Christian --~--~---------~--~----~------------~-------~--~----~ You received this message from the vim_use maillist. For more information, visit
            Message 5 of 14 , Nov 10, 2009
              On Tue, November 10, 2009 12:19 pm, Andy Wokula wrote:
              > Sorry, I didn't understand (dunno Perl).
              > I think you can't do it so nicely in Vim, but you can try the
              > following:
              >
              > " helper to keep the list unchanged (not required):
              > func! KeepVal(_)
              > return v:val
              > endfunc
              >
              > let in_list = ["foo", "bar"]
              > let out_dict = {}
              > call map(in_list, 'KeepVal(extend(out_dict, {v:val : 1}))')

              You don't need KeepVal():
              :call map(copy(in_list), 'extend(out_dict, {v:val : 1})')

              regards,
              Christian


              --~--~---------~--~----~------------~-------~--~----~
              You received this message from the "vim_use" maillist.
              For more information, visit http://www.vim.org/maillist.php
              -~----------~----~----~----~------~----~------~--~---
            • Andy Wokula
              ... I just didn t like getting a list full of dict references. And the return value of map() will be less junky . -- Andy
              Message 6 of 14 , Nov 10, 2009
                Christian Brabandt schrieb:
                > On Tue, November 10, 2009 12:19 pm, Andy Wokula wrote:
                >> Sorry, I didn't understand (dunno Perl).
                >> I think you can't do it so nicely in Vim, but you can try the
                >> following:
                >>
                >> " helper to keep the list unchanged (not required):
                >> func! KeepVal(_)
                >> return v:val
                >> endfunc
                >>
                >> let in_list = ["foo", "bar"]
                >> let out_dict = {}
                >> call map(in_list, 'KeepVal(extend(out_dict, {v:val : 1}))')
                >
                > You don't need KeepVal():
                > :call map(copy(in_list), 'extend(out_dict, {v:val : 1})')

                I just didn't like getting a list full of dict references. And the
                return value of map() will be less "junky".

                --
                Andy

                --~--~---------~--~----~------------~-------~--~----~
                You received this message from the "vim_use" maillist.
                For more information, visit http://www.vim.org/maillist.php
                -~----------~----~----~----~------~----~------~--~---
              • Christian Brabandt
                Hi Andy! ... Okay, how about ... regards, Christian -- • EFI is this other Intel brain-damage (the first one being ACPI). Torvalds, Linus (2006-07-24).
                Message 7 of 14 , Nov 10, 2009
                  Hi Andy!

                  On Di, 10 Nov 2009, Andy Wokula wrote:

                  >
                  > Christian Brabandt schrieb:
                  > > On Tue, November 10, 2009 12:19 pm, Andy Wokula wrote:
                  > >> let in_list = ["foo", "bar"]
                  > >> let out_dict = {}
                  > >> call map(in_list, 'KeepVal(extend(out_dict, {v:val : 1}))')
                  > >
                  > > You don't need KeepVal():
                  > > :call map(copy(in_list), 'extend(out_dict, {v:val : 1})')
                  >
                  > I just didn't like getting a list full of dict references. And the
                  > return value of map() will be less "junky".

                  Okay, how about

                  :let @_=string(map(copy(in_list), 'extend(out_dict, {v:val : 1})'))

                  regards,
                  Christian
                  --
                  • EFI is this other Intel brain-damage (the first one being ACPI).
                  Torvalds, Linus (2006-07-24).

                  --~--~---------~--~----~------------~-------~--~----~
                  You received this message from the "vim_use" maillist.
                  For more information, visit http://www.vim.org/maillist.php
                  -~----------~----~----~----~------~----~------~--~---
                • Tom Link
                  ... I personally don t think it is a good idea to use map for iterating over a list since it manipulates the list it is working on and returns that transformed
                  Message 8 of 14 , Nov 10, 2009
                    > :let @_=string(map(copy(in_list), 'extend(out_dict, {v:val : 1})'))

                    I personally don't think it is a good idea to use map for iterating
                    over a list since it manipulates the list it is working on and returns
                    that transformed list.

                    Since vimscripts provides no high-order function to iterate over a
                    list without modifying it, what's wrong with a dull looking for-loop:

                    for k in list
                    let dict[k] = 1
                    endfor


                    --~--~---------~--~----~------------~-------~--~----~
                    You received this message from the "vim_use" maillist.
                    For more information, visit http://www.vim.org/maillist.php
                    -~----------~----~----~----~------~----~------~--~---
                  • Tom Link
                    ... Okay, that was the original solution anyway. I d say stick to it. --~--~---------~--~----~------------~-------~--~----~ You received this message from the
                    Message 9 of 14 , Nov 10, 2009
                      > what's wrong with a dull looking for-loop:

                      Okay, that was the original solution anyway. I'd say stick to it.
                      --~--~---------~--~----~------------~-------~--~----~
                      You received this message from the "vim_use" maillist.
                      For more information, visit http://www.vim.org/maillist.php
                      -~----------~----~----~----~------~----~------~--~---
                    • Andy Wokula
                      ... Nothing, it s the best option ;) But the OP already used that. -- Andy --~--~---------~--~----~------------~-------~--~----~ You received this message
                      Message 10 of 14 , Nov 10, 2009
                        Tom Link schrieb:
                        >> :let @_=string(map(copy(in_list), 'extend(out_dict, {v:val : 1})'))
                        >
                        > I personally don't think it is a good idea to use map for iterating
                        > over a list since it manipulates the list it is working on and returns
                        > that transformed list.
                        >
                        > Since vimscripts provides no high-order function to iterate over a
                        > list without modifying it, what's wrong with a dull looking for-loop:
                        >
                        > for k in list
                        > let dict[k] = 1
                        > endfor

                        Nothing, it's the best option ;) But the OP already used that.

                        --
                        Andy

                        --~--~---------~--~----~------------~-------~--~----~
                        You received this message from the "vim_use" maillist.
                        For more information, visit http://www.vim.org/maillist.php
                        -~----------~----~----~----~------~----~------~--~---
                      • Tom Link
                        ... Sorry for the reply to self. If you really want to use map, you could use: exec let dict = { . join(map(split(lines, n ), string(v:val) . : 1 ), , )
                        Message 11 of 14 , Nov 10, 2009
                          On 10 Nov., 13:30, Tom Link <micat...@...> wrote:
                          > > what's wrong with a dull looking for-loop:
                          >
                          > Okay, that was the original solution anyway. I'd say stick to it.

                          Sorry for the reply to self. If you really want to use map, you could
                          use:

                          exec 'let dict = {'. join(map(split(lines, "\n"), 'string(v:val) .":
                          1"'), ",") .'}'

                          You have to make sure the lines are unique.

                          --~--~---------~--~----~------------~-------~--~----~
                          You received this message from the "vim_use" maillist.
                          For more information, visit http://www.vim.org/maillist.php
                          -~----------~----~----~----~------~----~------~--~---
                        • Marc Chantreux
                          hello all many thanks for you tries and replies. all of them where very instructive. i ll stick on the for-loop solution as it seems that functionnal solutions
                          Message 12 of 14 , Nov 10, 2009
                            hello all

                            many thanks for you tries and replies. all of them where very
                            instructive.

                            i'll stick on the for-loop solution as it seems that functionnal
                            solutions are harder to read/debug in viml.

                            regards
                            marc

                            --~--~---------~--~----~------------~-------~--~----~
                            You received this message from the "vim_use" maillist.
                            For more information, visit http://www.vim.org/maillist.php
                            -~----------~----~----~----~------~----~------~--~---
                          • Hari Krishna Dara
                            ... Since you seem to want a one liner, here is one: let t=eval( { .join(map(split(system( echo foo; echo bar ), n ), .v:val. : 1 ), , ). } ) --
                            Message 13 of 14 , Nov 10, 2009
                              On Tue, Nov 10, 2009 at 8:06 AM, Marc Chantreux <khatar@...> wrote:
                              >
                              > hello all
                              >
                              > many thanks for you tries and replies. all of them where very
                              > instructive.
                              >
                              > i'll stick on the for-loop solution as it seems that functionnal
                              > solutions are harder to read/debug in viml.

                              Since you seem to want a one liner, here is one:

                              let t=eval('{'.join(map(split(system("echo foo; echo bar"), "\n" ),
                              '"''".v:val."'': 1"'), ',').'}')

                              --
                              Hari
                              >
                              > regards
                              > marc
                              >
                              > >
                              >

                              --~--~---------~--~----~------------~-------~--~----~
                              You received this message from the "vim_use" maillist.
                              For more information, visit http://www.vim.org/maillist.php
                              -~----------~----~----~----~------~----~------~--~---
                            • Marc Chantreux
                              hello Hari ... I want my code to be readable then short. it seems that viml isn t the good langage for it. I stick on the for-loop :) regards, marc
                              Message 14 of 14 , Nov 11, 2009
                                hello Hari


                                On Tue, Nov 10, 2009 at 10:11:46PM -0800, Hari Krishna Dara wrote:
                                > Since you seem to want a one liner, here is one:
                                >
                                > let t=eval('{'.join(map(split(system("echo foo; echo bar"), "\n" ),
                                > '"''".v:val."'': 1"'), ',').'}')

                                I want my code to be readable then short. it seems that viml isn't the
                                good langage for it. I stick on the for-loop :)

                                regards,
                                marc

                                --~--~---------~--~----~------------~-------~--~----~
                                You received this message from the "vim_use" maillist.
                                For more information, visit http://www.vim.org/maillist.php
                                -~----------~----~----~----~------~----~------~--~---
                              Your message has been successfully submitted and would be delivered to recipients shortly.