Two Python Group Lists

I have two lists:

             A = ['T', 'D', 'Q', 'D', 'D']
             sessionid = [1, 1, 1, 2, 2]

In any case, I could group the elements in for the same sessionid so that I can print the following:

              1: ["T", "D","Q"]
              2: ["D","D"]
+4
source share
6 answers

The itertools function groupbyis for this kind of thing. Some of the other answers here create a dictionary that is very reasonable, but if you really don't want to dict, then you can do this:

from itertools import groupby
from operator import itemgetter

A = ['T', 'D', 'Q', 'D', 'D']
sessionid = [1, 1, 1, 2, 2]    

for k, g in groupby(zip(sessionid, A), itemgetter(0)):
    print('{}: {}'.format(k, list(list(zip(*g))[1])))

Output

1: ['T', 'D', 'Q']
2: ['D', 'D']

operator.itemgetter(0)returns a called object that retrieves an element at index 0 of any object that you pass it; groupbyuses this as a key function to determine which items can be grouped together.

, , sessionid . , , zip(sessionid, A), , groupby.


, Python 2 Python 3

+3

itertools, :

index = 0
dict = {}
for i in sessionid:
    if not (i in dict):
        dict[i] = []
    else:
        dict[i].append(A[index])
    index += 1

print(dict) # {1: ['T', 'D', 'Q'], 2: ['D', 'D']}

:

from collections import defaultdict
dict = defaultdict(list)
for i, item in enumerate(sessionid):
    dict[item].append(A[i])
+3

zip:

A = ['T', 'D', 'Q', 'D', 'D']
sessionid = [1, 1, 1, 2, 2]

result = {i:[] for i in sessionid}
for i,j in zip(sessionid,A):
    result[i].append(j)

defaultdict:

from collections import defaultdict
result = defaultdict(list)
for k, v in zip(sessionid, A):
   result[k].append(v)

:

>>> result
{1: ['T', 'D', 'Q'], 2: ['D', 'D']}
+3

{k: list(i for (i, _) in v) for k, v in itertools.groupby(zip(A, sessionid), operator.itemgetter(1))}

{k: list(map(operator.itemgetter(0), v)) for k, v in itertools.groupby(zip(A, sessionid), operator.itemgetter(1))}
+2

:

import pandas as pd

A = ['T', 'D', 'Q', 'D', 'D']
sessionid = [1, 1, 1, 2, 2]

pd.DataFrame({'A':A, 'id':sessionid}).groupby('id')['A'].apply(list).to_dict()

#Out[10]: {1: ['T', 'D', 'Q'], 2: ['D', 'D']}
+1

numpy , , np.where

import numpy as np

A = np.asarray(['T', 'D', 'Q', 'D', 'D'])
sessionid = np.asarray([1, 1, 1, 2, 2])

Ind_1 = np.where(sessionid == 1)
Ind_2 = np.where(sessionid == 2)

print A[Ind_1]

['T' 'D' 'Q']

of course you can turn this into a function that takes N, the desired session, and returns your values.

Hope this helps!

+1
source

All Articles