Velocity Reviews > Packing a list of lists with struct.pack()

# Packing a list of lists with struct.pack()

Panos Laganakos
Guest
Posts: n/a

 04-24-2006
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
Guest
Posts: n/a

 04-24-2006
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
Guest
Posts: n/a

 04-24-2006
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
Guest
Posts: n/a

 04-26-2006
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
Guest
Posts: n/a

 04-27-2006
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
Guest
Posts: n/a

 04-27-2006
Unfortunately I'm familiar with the generator concept, I'll look into
it though, 'cause it saved me at least once already

Thanks mate.