2016-04-19 5 views
4

У меня есть два списка:Python группы два списка

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

Есть в любом случае я мог группируют элементы в А для того же SessionID, так что я мог бы напечатать следующее:

   1: ["T", "D","Q"] 
       2: ["D","D"] 
+3

вы узнали о 'itertools.groupby'? –

ответ

3

Функция itertools groupby предназначена для выполнения подобных операций. Некоторые другие ответы здесь создать словарь, который является очень разумным, но если вы на самом деле не хотите dict, то вы можете сделать это:

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) возвращается вызываемый, который извлекает элемент по индексу 0 любого объекта, который вы его передаете; groupby использует это как ключевую функцию для определения того, какие элементы могут быть сгруппированы вместе.

Обратите внимание, что это и аналогичные решения предполагают, что индексы sessionid сортируются. Если это не так, вам нужно отсортировать список кортежей, возвращаемых zip(sessionid, A) с той же ключевой функцией, прежде чем передавать их в groupby.


отредактирован правильно работать на Python 2 и Python 3

+0

thx для кода, поскольку я действительно не хочу dict. просто проверяя код ur, и он говорит, что «объект zip» не подлежит расшифровке », любой шанс, что вы знаете, что происходит? Я использую Python 3 на ноутбуке jupyter –

+0

thx! теперь он отлично работает! –

+0

на самом деле распечатывает результаты в скобках («T», «D»), я случайно могу распечатать результаты в скобках (например: [«T», «D»])? спасибо!!!!!! –

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]) 
+0

Вы можете использовать 'collections.defaultdict', чтобы избежать условной проверки. – kojiro

+2

Вы можете использовать перечисление, чтобы не увеличивать индекс самостоятельно. – Schore

+0

Это переопределяет ключевое слово и включает ненужные проверки. Значение defaultdict позволяет избежать этого. –

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']} 
1

Вы можете сделать:

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']} 
2

Один лайнер

{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))} 
+0

Вам все равно нужно импортировать itertools :) –

+0

И оператор тоже! – malbarbo

+1

Одна строка, но вложенная петля. –

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']

Вы можете, конечно, превратить это в функцию, которая берет N, желаемую сессию и возвращает ваши значения A.

Надеюсь, это поможет!

Смежные вопросы