Packing a list of lists with struct.pack()

P

Panos Laganakos

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?
 
P

Panos Laganakos

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.
 
F

Fredrik Lundh

Panos said:
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>
 
P

Panos Laganakos

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?
 
F

Fredrik Lundh

Panos said:
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>
 
P

Panos Laganakos

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

Thanks mate.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top