Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Packing a list of lists with struct.pack() (http://www.velocityreviews.com/forums/t356946-packing-a-list-of-lists-with-struct-pack.html)

 Panos Laganakos 04-24-2006 04:22 PM

Packing a list of lists with struct.pack()

Hello,

I have a list that includes lists of integers, in the form of:
li = [[0, 1, 2], [3, 4, 5], ...]

packed = struct.pack(str(len(li)*3)+'i', li)

The frmt part is right, as I'm multiplying by 3, 'cause each inner list
has 3 elements.

What can I do to get li as a single list of integers?

I tried list comprehension in the form of:
[([j for j in i]) for i in li]

But that doesn't seem to work, any ideas?

 Panos Laganakos 04-24-2006 04:29 PM

Re: Packing a list of lists with struct.pack()

Just came up with this:

litemp = []

[litemp.extend(i) for i in li]

Seems to give me a list with all the inner elements of li, not sure if
struct.pack will accept it now, but I'll give it a try.

 Fredrik Lundh 04-24-2006 04:56 PM

Re: Packing a list of lists with struct.pack()

Panos Laganakos wrote:

> I have a list that includes lists of integers, in the form of:
> li = [[0, 1, 2], [3, 4, 5], ...]

> What can I do to get li as a single list of integers?
>
> I tried list comprehension in the form of:
> [([j for j in i]) for i in li]
>
> But that doesn't seem to work, any ideas?

you have it backwards: a nested list expression is like a nested
for loop, but with the innermost expression at the beginning. a
for-loop would look like:

for i in li:
for j in i:
... do something with j ...

so the corresponding comprehension is

[j for i in li for j in i]

which gives you the expected result. when you pass this to pack,
you can use a generator expression instead:

data = struct.pack("%di" % (len(li)*3), *(j for i in li for j in i))

</F>

 Panos Laganakos 04-26-2006 05:26 PM

Re: Packing a list of lists with struct.pack()

Fredrik, thanks alot.

Your preposition worked like a charm, plus I got to learn how to
reverse an inner for loop using list comprehensions :)

What I don't understand is what are you doing with *(...), this is
supposed to pack its contents as a list?

 Fredrik Lundh 04-27-2006 11:20 AM

Re: Packing a list of lists with struct.pack()

Panos Laganakos wrote:

> What I don't understand is what are you doing with *(...), this is
> supposed to pack its contents as a list?

the *arg form treats each value in the arg sequence as a separate argument.
for example,

arg = 1, 2, 3
function(*arg)

is the same thing as

function(1, 2, 3)

when used with a generator expression, *(genexp) simply fetches the arguments
from the generated sequence.

(note that struct.pack expects a format string plus N additional arguments, not
a format string and an N-item sequence)

</F>

 Panos Laganakos 04-27-2006 01:15 PM

Re: Packing a list of lists with struct.pack()

Unfortunately I'm familiar with the generator concept, I'll look into
it though, 'cause it saved me at least once already :)

Thanks mate.

 All times are GMT. The time now is 06:57 AM.