Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Is there an easier way to express this list slicing?

Reply
Thread Tools

Is there an easier way to express this list slicing?

 
 
John Henry
Guest
Posts: n/a
 
      11-30-2006
If I have a list of say, 10 elements and I need to slice it into
irregular size list, I would have to create a bunch of temporary
variables and then regroup them afterwords, like:

# Just for illustration. Alist can be any existing 10 element list
a_list=("",)*10
(a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
alist=(a,)
blist=(b,)
clist=(c1,c2,c3)
dlist=(d2,d3,d4,d5)

That obviously work but do I *really* have to do that?

BTW: I know you can do:
alist=a_list[0]
blist=a_list[1]
clist=a_list[2:5]
dlist=a_list[5:]

but I don't see that it's any better.

Can I say something to the effect of:

(a,b,c[0:2],d[0:5])=a_list # Obviously this won't work

??

I am asking this because I have a section of code that contains *lots*
of things like this. It makes the code very unreadable.

Thanks,

 
Reply With Quote
 
 
 
 
Thomas Ploch
Guest
Posts: n/a
 
      11-30-2006
John Henry schrieb:
> If I have a list of say, 10 elements and I need to slice it into
> irregular size list, I would have to create a bunch of temporary
> variables and then regroup them afterwords, like:
>
> # Just for illustration. Alist can be any existing 10 element list
> a_list=("",)*10
> (a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
> alist=(a,)
> blist=(b,)
> clist=(c1,c2,c3)
> dlist=(d2,d3,d4,d5)
>
> That obviously work but do I *really* have to do that?
>
> BTW: I know you can do:
> alist=a_list[0]
> blist=a_list[1]
> clist=a_list[2:5]
> dlist=a_list[5:]
>
> but I don't see that it's any better.
>
> Can I say something to the effect of:
>
> (a,b,c[0:2],d[0:5])=a_list # Obviously this won't work
>
> ??
>
> I am asking this because I have a section of code that contains *lots*
> of things like this. It makes the code very unreadable.
>
> Thanks,
>


Nothing in your code actually __is__ a list. they are all tuples...
A list is:
aList = [a,b,c1,c2,c3,d1,d2,d3,d4,d5]

Thomas
 
Reply With Quote
 
 
 
 
John Henry
Guest
Posts: n/a
 
      11-30-2006
Well, pardoon me.

Next.

Thomas Ploch wrote:
> John Henry schrieb:
> > If I have a list of say, 10 elements and I need to slice it into
> > irregular size list, I would have to create a bunch of temporary
> > variables and then regroup them afterwords, like:
> >
> > # Just for illustration. Alist can be any existing 10 element list
> > a_list=("",)*10
> > (a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
> > alist=(a,)
> > blist=(b,)
> > clist=(c1,c2,c3)
> > dlist=(d2,d3,d4,d5)
> >
> > That obviously work but do I *really* have to do that?
> >
> > BTW: I know you can do:
> > alist=a_list[0]
> > blist=a_list[1]
> > clist=a_list[2:5]
> > dlist=a_list[5:]
> >
> > but I don't see that it's any better.
> >
> > Can I say something to the effect of:
> >
> > (a,b,c[0:2],d[0:5])=a_list # Obviously this won't work
> >
> > ??
> >
> > I am asking this because I have a section of code that contains *lots*
> > of things like this. It makes the code very unreadable.
> >
> > Thanks,
> >

>
> Nothing in your code actually __is__ a list. they are all tuples...
> A list is:
> aList = [a,b,c1,c2,c3,d1,d2,d3,d4,d5]
>
> Thomas


 
Reply With Quote
 
Chris Mellon
Guest
Posts: n/a
 
      11-30-2006
On 11/30/06, Thomas Ploch <(E-Mail Removed)> wrote:
> John Henry schrieb:
> > If I have a list of say, 10 elements and I need to slice it into
> > irregular size list, I would have to create a bunch of temporary
> > variables and then regroup them afterwords, like:
> >
> > # Just for illustration. Alist can be any existing 10 element list
> > a_list=("",)*10
> > (a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
> > alist=(a,)
> > blist=(b,)
> > clist=(c1,c2,c3)
> > dlist=(d2,d3,d4,d5)
> >
> > That obviously work but do I *really* have to do that?
> >
> > BTW: I know you can do:
> > alist=a_list[0]
> > blist=a_list[1]
> > clist=a_list[2:5]
> > dlist=a_list[5:]
> >
> > but I don't see that it's any better.
> >
> > Can I say something to the effect of:
> >
> > (a,b,c[0:2],d[0:5])=a_list # Obviously this won't work
> >
> > ??
> >
> > I am asking this because I have a section of code that contains *lots*
> > of things like this. It makes the code very unreadable.
> >
> > Thanks,
> >

>
> Nothing in your code actually __is__ a list. they are all tuples...
> A list is:
> aList = [a,b,c1,c2,c3,d1,d2,d3,d4,d5]
>


True but not relevant, really, he should have said "sequence". But
more importantly,
you don't show what you do with alist, blist,clist,dlist. Without
knowing what the end result is, nobody is going to be able to help you
eliminate the middle steps.

> Thomas
> --
> http://mail.python.org/mailman/listinfo/python-list
>

 
Reply With Quote
 
mdsteele@gmail.com
Guest
Posts: n/a
 
      11-30-2006
John Henry wrote:
> Can I say something to the effect of:
>
> (a,b,c[0:2],d[0:5])=a_list # Obviously this won't work


Your best bet is probably:

x = [...some list...]
a,b,c,d = x[:1],x[1:2],x[2:5],x[5:]

> I am asking this because I have a section of code that contains *lots*
> of things like this. It makes the code very unreadable.


Of course, if you're always slicing up lists the same way (say, into
1,1,3,5 element sections) then you could improve readability by writing
a function that takes the list and returns a tuple of the pieces, such
as:

def slice_list(x):
return x[:1],x[1:2],x[2:5],x[5:]

a,b,c,d = slice_list(first_list)
e,f,g,h = slice_list(second_list)

-Matt

 
Reply With Quote
 
Neil Cerutti
Guest
Posts: n/a
 
      11-30-2006
On 2006-11-30, John Henry <(E-Mail Removed)> wrote:
> If I have a list of say, 10 elements and I need to slice it into
> irregular size list, I would have to create a bunch of temporary
> variables and then regroup them afterwords, like:
>
> # Just for illustration. Alist can be any existing 10 element list
> a_list=("",)*10
> (a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
> alist=(a,)
> blist=(b,)
> clist=(c1,c2,c3)
> dlist=(d2,d3,d4,d5)
>
> That obviously work but do I *really* have to do that?


Please post actual code we can run, rather than text that is
almost, but not quite, entirely unlike Python code.

> BTW: I know you can do:
> alist=a_list[0]
> blist=a_list[1]


Note that alist and blist are not necessarily lists, as you did
not use slice notation.

> clist=a_list[2:5]
> dlist=a_list[5:]
>
> but I don't see that it's any better.


I think it looks much better, personally.

If you are iterating through that sequence of slices a lot,
consider using a generator that yields the sequence.

>>> def parts(items):

... yield items[0:1]
... yield items[1:2]
... yield items[2:5]
... yield items[5:]

>>> for seq in parts(range(10)):

... print seq
[0]
[1]
[2, 3, 4]
[5, 6, 7, 8, 9]

--
Neil Cerutti
I guess there are some operas I can tolerate and Italian isn't one of them.
--Music Lit Essay
 
Reply With Quote
 
Neil Cerutti
Guest
Posts: n/a
 
      11-30-2006
On 2006-11-30, Neil Cerutti <(E-Mail Removed)> wrote:
> On 2006-11-30, John Henry <(E-Mail Removed)> wrote:
>> If I have a list of say, 10 elements and I need to slice it into
>> irregular size list, I would have to create a bunch of temporary
>> variables and then regroup them afterwords, like:
>>
>> # Just for illustration. Alist can be any existing 10 element list
>> a_list=("",)*10
>> (a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
>> alist=(a,)
>> blist=(b,)
>> clist=(c1,c2,c3)
>> dlist=(d2,d3,d4,d5)
>>
>> That obviously work but do I *really* have to do that?

>
> Please post actual code we can run, rather than text that is
> almost, but not quite, entirely unlike Python code.


Ummm... that comment is withdrawn. :-O

--
Neil Cerutti
 
Reply With Quote
 
Paul McGuire
Guest
Posts: n/a
 
      11-30-2006
"John Henry" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ps.com...
> If I have a list of say, 10 elements and I need to slice it into
> irregular size list, I would have to create a bunch of temporary
> variables and then regroup them afterwords, like:
>
> # Just for illustration. Alist can be any existing 10 element list
> a_list=("",)*10
> (a,b,c1,c2,c3,d1,d2,d3,d4,d5)=a_list
> alist=(a,)
> blist=(b,)
> clist=(c1,c2,c3)
> dlist=(d2,d3,d4,d5)
>
> That obviously work but do I *really* have to do that?
>
> BTW: I know you can do:
> alist=a_list[0]
> blist=a_list[1]
> clist=a_list[2:5]
> dlist=a_list[5:]
>
> but I don't see that it's any better.


The slicing notation is about the best general solution.

If you are doing this a lot, you should write some sort of "break up the
list function". Here's one that takes a list of list lengths to break the
list into.

-- Paul


def splitUp(src,lens):
ret = []
cur = 0
for var,length in varmap:
if length is not None:
ret.append( a_list[cur:cur+length] )
cur += length
else:
ret.append( a_list[cur:] )
return ret


origlist = list("ABCDEFGHIJ")
alist, blist, clist, dlist = splitUp( origlist, (1,1,3,None) )
print alist, blist, clist, dlist

Prints
['A'] ['B'] ['C', 'D', 'E'] ['F', 'G', 'H', 'I', 'J']


 
Reply With Quote
 
Paul McGuire
Guest
Posts: n/a
 
      11-30-2006
"Paul McGuire" <(E-Mail Removed)._bogus_.com> wrote in message
news:MmGbh.10434$(E-Mail Removed)...
> "John Henry" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed) ps.com...

snip

Grrrr... that's what I get for not keeping editor and interpreter windows in
sync. My post was referencing vars I had defined in the interpreter, but
which the function had no clue of. !!! Here's a working version.

-- Paul


def splitUp(src,lens):
ret = []
cur = 0
for length in lens:
if length is not None:
ret.append( src[cur:cur+length] )
cur += length
else:
ret.append( src[cur:] )
return ret

origlist = list("ABCDEFGHIJ")
alist, blist, clist, dlist = splitUp( origlist, (1,1,3,None) )
print alist, blist, clist, dlist


 
Reply With Quote
 
John Henry
Guest
Posts: n/a
 
      11-30-2006

http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> John Henry wrote:
> > Can I say something to the effect of:
> >
> > (a,b,c[0:2],d[0:5])=a_list # Obviously this won't work

>
> Your best bet is probably:
>
> x = [...some list...]
> a,b,c,d = x[:1],x[1:2],x[2:5],x[5:]
>


Dude! Why didn't I think of that (tunnel vision).

Thanks,


> > I am asking this because I have a section of code that contains *lots*
> > of things like this. It makes the code very unreadable.

>
> Of course, if you're always slicing up lists the same way (say, into
> 1,1,3,5 element sections) then you could improve readability by writing
> a function that takes the list and returns a tuple of the pieces, such
> as:
>
> def slice_list(x):
> return x[:1],x[1:2],x[2:5],x[5:]
>
> a,b,c,d = slice_list(first_list)
> e,f,g,h = slice_list(second_list)
>
> -Matt


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
There must be an easier way Jim S HTML 3 02-15-2007 02:39 AM
Is there an easier way to work with pointers (sample code included) walter.preuninger@gmail.com C Programming 22 03-12-2006 05:30 AM
Hash of Structs in a Package, is there an easier way? Norman Ackroyd Perl 1 07-28-2004 11:54 AM
Is there an easier way to break a list into sub groups MetalOne Python 4 02-22-2004 09:58 PM
Defrag XP There must be an easier way. ChrisTOE@address.invalid Computer Support 4 01-19-2004 03:41 AM



Advertisments