2013-08-09 5 views
0

Надежда и может помочь мне ж/этой функции питона:Подсчет элементов в списке списков в Python

def comparapal(lista):#lista is a list of lists where each list has 4 elements 
    listaPalabras=[] 
    for item in lista: 
    if item[2] in eagles_dict.keys():# filter the list if the 3rd element corresponds to the key in the dictionary 
     listaPalabras.append([item[1],item[2]]) #create a new list with elements 2 and 3 

В listaPalabras результат:

[ 
    ['bien', 'NP00000'], 
    ['gracia', 'NCFP000'], 
    ['estar', 'VAIP1S0'], 
    ['bien', 'RG'], 
    ['huevo', 'NCMS000'], 
    ['calcio', 'NCMS000'], 
    ['leche', 'NCFS000'], 
    ['proteina', 'NCFS000'], 
    ['francisco', 'NP00000'], 
    ['ya', 'RG'], 
    ['ser', 'VSIS3S0'], 
    ['cosa', 'NCFS000'] 
] 

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

Извините за неоднозначность, функция должна вернуть список списков w/3 элементов: слово, тег и количество вхождений каждого слова. Но для того, чтобы подсчитать слова, мне нужно сравнить слово w/others, и если существует 2 или более слов, сравните теги с chk разницей. Если теги различаются, то учитывайте слова отдельно.

результат -> [['bien', 'NP00000', 1], ['bien', 'RG', 1]] -> два одинаковых слова, но подсчитывается отдельно путем сравнения тегов Спасибо заранее :

+1

Вы хотите отсортировать список, используя эти данные? –

+0

, если вы хотите отсортировать этот список первым, а затем вторым элементом, просто выполните сортировку (<имя вашего списка>) ' –

+0

Ths Roman и Rohit, но я хочу сравнить 1-й элемент каждого списка, чтобы, если они являются то же, а затем сравнить их теги, которые 2-й элемент каждого списка в chk, если они совершенно разные – JPP

ответ

2
import collections 
inlist = [ 
    ['bien', 'NP00000'], 
    ['gracia', 'NCFP000'], 
    ['estar', 'VAIP1S0'], 
    ['bien', 'RG'], 
    ['huevo', 'NCMS000'], 
    ['calcio', 'NCMS000'], 
    ['leche', 'NCFS000'], 
    ['proteina', 'NCFS000'], 
    ['francisco', 'NP00000'], 
    ['ya', 'RG'], 
    ['ser', 'VSIS3S0'], 
    ['cosa', 'NCFS000'] 
] 
[(a,b,v) for (a,b),v in collections.Counter(map(tuple,inlist)).iteritems()] 
#=>[('proteina', 'NCFS000', 1), ('francisco', 'NP00000', 1), ('ser', 'VSIS3S0', 1), ('bien', 'NP00000', 1), ('calcio', 'NCMS000', 1), ('estar', 'VAIP1S0', 1), ('huevo', 'NCMS000', 1), ('gracia', 'NCFP000', 1), ('bien', 'RG', 1), ('cosa', 'NCFS000', 1), ('ya', 'RG', 1), ('leche', 'NCFS000', 1)] 

Вы хотите посчитать количество вхождений каждой пары. Выражение counter делает это. Понимание списка определяет это как тройки.

+0

Благодаря y'all это сработало красиво – JPP

+0

@JPP Не стесняйтесь принять этот ответ в этом случае. – Marcin

1

Какой конкретный выход вам нужен? Я не знаю, что именно вам нужно сделать, но если вы хотите к деталям группы, связанные с тем же словом, вы можете превратить эту структуру в словаре и манипулировать его позже

>>> new = {} 
>>> for i,j in a: # <-- a = listaPalabras 
     if new.get(i) == None: 
       new[i] = [j] 
     else: 
       new[i].append(j) 

, который даст нам:

{'francisco': ['NP00000'], 'ser': ['VSIS3S0'], 'cosa': ['NCFS000'], 'ya': ['RG'], 'bien': ['NP00000', 'RG'], 'estar': ['VAIP1S0'], 'calcio': ['NCMS000'], 'leche': ['NCFS000'], 'huevo': ['NCMS000'], 'gracia': ['NCFP000'], 'proteina': ['NCFS000']} 

, а затем позже вы можете сделать:

>>> for i in new: 
     if len(new[i]) > 1: 
       print "compare {this} and {that}".format(this=new[i][0],that=new[i][1]) 

напечатает:

compare NP00000 and RG #for key bien 

EDIT: На первом этапе, вы можете также использовать defaultdict, как это было предложено Marcin в комментарии, это будет выглядеть так:

>>> d = defaultdict(list) 
>>> for i,j in a: 
     d.setdefault(i,[]).append(j) 

EDIT2 (ответ на комментарий OP в)

for i in d: 
    item = [] 
    item.append(i) 
    item.extend(d[i]) 
    item.append(len(d[i])) 
    result.append(item) 

Это дает нам:

[['francisco', 'NP00000', 1], ['ser', 'VSIS3S0', 1], ['cosa', 'NCFS000', 1], ['ya', 'RG', 1], ['bien', 'NP00000', 'RG', 2], ['estar', 'VAIP1S0', 1], ['calcio', 'NCMS000', 1], ['leche', 'NCFS000', 1], ['huevo', 'NCMS000', 1], ['gracia', 'NCFP000', 1], ['proteina', 'NCFS000', 1]] 
+0

лучше с defaultdict – Marcin

+0

Не знаю, может быть, почему вы так думаете? Трудно сказать, что именно здесь требуется –

+0

Потому что 'defaultdict' существует для замены if/else в вашем коде. – Marcin

0

чисто на основе списка решение возможно, конечно, но требует дополнительной зацикливание. Если эффективность важна, лучше было бы заменить listaPalabras на dict.

def comparapal(lista): 
    listaPalabras=[] 
    for item in lista: 
    if item[2] in eagles_dict.keys(): 
     listaPalabras.append([item[1],item[2]]) 

    last_tt = [None, None] 
    for tt in sorted(listaPalabras): 
    if tt == last_tt: 
     print "Observed %s twice" % tt 
    elif tt[0] == last_tt[0]: 
     print "Observed %s and %s" % (tt, last_tt) 
    last_tt = tt 

Это дает вам: Observed ['bien', 'RG'] and ['bien', 'NP00000']

Если это не подходит вашим целям, пожалуйста, сформулируйте Ваши вопросы.

+0

В результате будет список списков, содержащий 3 элемента: слово, тег и количество вхождений каждого слова (поэтому мне нужно сравнить их теги, если слово существует более одного раза см., если они совершенно разные, и считать их правильно). Сортировка не важна, я думаю, что заголовок моего вопроса непонятен ... – JPP