470,599 Members | 1,494 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,599 developers. It's quick & easy.

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?

Apr 24 '06 #1
5 13459
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.

Apr 24 '06 #2
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>

Apr 24 '06 #3
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?

Apr 26 '06 #4
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>

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

Thanks mate.

Apr 27 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Volkan YAZICI | last post: by
2 posts views Thread by gbb0330 | last post: by
12 posts views Thread by Jonathan Bartlett | last post: by
16 posts views Thread by Shwetabh | last post: by
18 posts views Thread by Edward Diener | last post: by
1 post views Thread by Gajendra | last post: by
1 post views Thread by QbProg | last post: by
36 posts views Thread by pereges | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.