2016-11-24 2 views
0

В моей функции я буду создавать различные кортежи и добавить к пустому списку:Как применить группу по списку кортежей в python?

tup = (pattern,matchedsen) 
matchedtuples.append(tup) 

Узоры имеют формат регулярных выражений. Ищу применять groupby() на matchedtuples следующим способом:

Например:

matchedtuples = [(p1, s1) , (p1,s2) , (p2, s5)] 

И я ищу этот результат:

result = [ (p1,(s1,s2)) , (p2, s5)] 

Таким образом, в этом случае я буду иметь группы предложений с одинаковым шаблоном. Как я могу это сделать?

ответ

0

Если вам нужен вывод, который вы представляете, вам необходимо вручную выполнить цикл с помощью matchedtuples и создать свой список.

Во-первых, конечно же, если matchedtuples список не отсортирован, сортировать его itemgetter:

from operator import itemgetter as itmg 

li = sorted(matchedtuples, key=itmg(0)) 

Затем Переберите результат поставляется groupby и добавить в список r на основе размера Группа:

r = [] 
for i, j in groupby(matchedtuples, key=itmg(0)): 
    j = list(j) 
    ap = (i, j[0][1]) if len(j) == 1 else (i, tuple(s[1] for s in j)) 
    r.append(ap) 
0

Мой ответ на ваш вопрос будет работать для любой структуры ввода, которую вы будете использовать, и распечатывайте тот же результат, что и вы. И я буду использовать только groupby из itertools модуля:

# Let's suppose your input is something like this 
a = [("p1", "s1"), ("p1", "s2"), ("p2", "s5")] 

from itertools import groupby 

result = [] 

for key, values in groupby(a, lambda x : x[0]): 
    b = tuple(values) 
    if len(b) >= 2: 
     result.append((key, tuple(j[1] for j in b))) 
    else: 
     result.append(tuple(j for j in b)[0]) 

print(result) 

Выход:

[('p1', ('s1', 's2')), ('p2', 's5')] 

В той же работе решение, если добавить больше значений к введенному:

# When you add more values to your input 
a = [("p1", "s1"), ("p1", "s2"), ("p2", "s5"), ("p2", "s6"), ("p3", "s7")] 

from itertools import groupby 

result = [] 

for key, values in groupby(a, lambda x : x[0]): 
    b = tuple(values) 
    if len(b) >= 2: 
     result.append((key, tuple(j[1] for j in b))) 
    else: 
     result.append(tuple(j for j in b)[0]) 

print(result) 

Выход:

[('p1', ('s1', 's2')), ('p2', ('s5', 's6')), ('p3', 's7')] 

Теперь, если вы измените входную структуру:

# Let's suppose your modified input is something like this 
a = [(["p1"], ["s1"]), (["p1"], ["s2"]), (["p2"], ["s5"])] 

from itertools import groupby 

result = [] 

for key, values in groupby(a, lambda x : x[0]): 
    b = tuple(values) 
    if len(b) >= 2: 
     result.append((key, tuple(j[1] for j in b))) 
    else: 
     result.append(tuple(j for j in b)[0]) 

print(result) 

Выход:

[(['p1'], (['s1'], ['s2'])), (['p2'], ['s5'])] 

Кроме того, та же работа решения, если добавить больше значения к вашей новой входной структуре:

# When you add more values to your new input 
a = [(["p1"], ["s1"]), (["p1"], ["s2"]), (["p2"], ["s5"]), (["p2"], ["s6"]), (["p3"], ["s7"])] 

from itertools import groupby 

result = [] 

for key, values in groupby(a, lambda x : x[0]): 
    b = tuple(values) 
    if len(b) >= 2: 
     result.append((key, tuple(j[1] for j in b))) 
    else: 
     result.append(tuple(j for j in b)[0]) 

print(result) 

Выход:

[(['p1'], (['s1'], ['s2'])), (['p2'], (['s5'], ['s6'])), (['p3'], ['s7'])] 

Пс: Проверьте этот код, и если он сломается с любыми другими входами, пожалуйста, дайте мне знать.

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