Python, format this list
I've got a list like [(1, 2), (1, 8), (2, 3), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]
I want to make it looks like [('1',' ', '2', '8'), ('2', ' ', '3', '7', '8', '9'), ('3', " ", '2', '5', '6', '7', '7', '9')]
How can I code this loop? Really tried times, and nothing came up. Please help~~
Step 1. Convert the list to a dictionary. Each element is a list of values with a common key. (Hint: The key is the first value of each pair)
Step 2. Now format each dictionary as key, space, value list.
Not exactly what you asked for, but maybe easier to work with?
>>> from itertools import groupby
>>> L = [(1, 2), (1, 8), (2, 3), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]
>>> for key, group in groupby(L, lambda x: x[0]):
... print key, list(group)
...
1 [(1, 2), (1, 8)]
2 [(2, 3), (2, 7), (2, 8), (2, 9)]
3 [(3, 1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]
Link to documentation.
Edit:
I suppose something like this is more what you're asking for:
>>> d = {}
>>> for key, group in groupby(L, lambda x: x[0]):
... d[key] = [i[1] for i in group]
...
>>> d
{1: [2, 8], 2: [3, 7, 8, 9], 3: [1, 2, 5, 6, 7, 7, 9]}
If you absolutely want the key to be a string, you can code it this way:
d[str(key)] = [i[1] for i in group]
from collections import defaultdict
s = [
(1,2),(1,8),
(2,3),(2,7),(2,8),(2,9),
(3,1),(3,2),(3,5),(3,6),(3,7),(3,7),(3,9)
]
D = defaultdict(list)
for a,b in s:
D[a].append(b)
L = []
for k in sorted(D.keys()):
e = [str(k),'']
e.extend(map(str,D[k]))
L.append(tuple(e))
print L
Output:
[('1', '', '2', '8'), ('2', '', '3', '7', '8', '9'), ('3', '', '1', '2', '5', '6', '7', '7', '9')]
You've got to explain how it works to your teacher ;^)
a = [(1, 2), (1, 8), (2, 3), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 5), (3, 6), (3, 7), (3, 7), (3, 9)]
x1=None # here we keep track of the last x we saw
ys=None # here we keep track of all ys we've seen for this x1
result = []
for x,y in a:
if x != x1: # this is an x we haven't seen before
if ys: # do we have results for the last x?
result.append( ys )
ys = [ x, '', y ] # initialize the next set of results
x1 = x
else:
ys.append( y ) # add this to the results we are buliding
if ys:
result.append( ys ) # add the last set of results
print result
精彩评论