Possible Duplicate:
A Transpose/Unzip Function in Python
I have a list of sequences, each sequence has two items. I would like to turn this into two lists.
catalog = [('abc', '123'), ('foo', '456'), ('bar', '789'), ('test', '1337')]
Right now I'm just doing this:
names = []
vals = []
for product in catalog:
names.append(product[0])
vals.append(product[1])
print (names)
print (vals)
Which outputs two lists, and works just fine:
['abc', 'foo', 'bar', 'test']
['123', '456', '789', '1337']
Is there a neater, more 'pythonic' way of doing this? Or should I stick with what I have? Any corrections or feedback on programming style is welcome, I'm new and trying to learn best practices.
Python String split() MethodThe split() method splits a string into a list. You can specify the separator, default separator is any whitespace. Note: When maxsplit is specified, the list will contain the specified number of elements plus one.
Use the array_split() method, pass in the array you want to split and the number of splits you want to do.
>>> catalog = [('abc', '123'), ('foo', '456'), ('bar', '789'), ('test', '1337')]
>>> names, vals = zip(*catalog)
>>> names
('abc', 'foo', 'bar', 'test')
>>> vals
('123', '456', '789', '1337')
The *catalog
syntax here is called Unpacking Argument Lists, and zip(*catalog)
translates into the call zip(catalog[0], catalog[1], catalog[2], ...)
.
The zip()
builtin function groups iterables by indices, so when you pass a bunch of two-element tuples as above, you get a two-element list of tuples where the first tuple contains the first element of each tuple from catalog
, and the second tuple contains the second element from each tuple from catalog
.
In a quick timeit test the zip()
version outperforms a looping approach when I tested with 1,000,000 pairs:
In [1]: catalog = [(i, i+1) for i in range(1000000)]
In [2]: def with_zip():
...: return zip(*catalog)
...:
In [3]: def without_zip():
...: names, vals = [], []
...: for name, val in catalog:
...: names.append(name)
...: vals.append(val)
...: return names, vals
...:
In [4]: %timeit with_zip()
1 loops, best of 3: 176 ms per loop
In [5]: %timeit without_zip()
1 loops, best of 3: 250 ms per loop
Sure, use this:
lst = [('abc', '123'), ('foo', '456'), ('bar', '789'), ('test', '1337')]
tup1, tup2 = zip(*lst)
The above will return a pair of tuples with the elements. If you need lists, then use this:
lst = [('abc', '123'), ('foo', '456'), ('bar', '789'), ('test', '1337')]
lst1, lst2 = map(list, zip(*lst))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With