подсчитывать вхождения в списке наборов

#python #list #set

#python #Список #набор

Вопрос:

У меня есть переменная, содержащая список списков, содержащих 2 набора, она выглядит так:

 [[{'angular', 'java', 'sql', 'xml-schema'},
  {'db2', 'docker', 'git', 'hibernate', 'jenkins', 'maven', 'rest'}],
 [{'java'}, {'maven'}],
 [{'java'}, {'oracle'}],
 [{'c  ', 'cobol', 'java', 'javascript'}, set()],
 [{'angular', 'java'}, set()],
 [{'java'}, set()]]
  

Теперь то, что я хотел бы сделать, это подсчитать вхождения каждого отдельного элемента все вместе, я просто не уверен, как это сделать. Должен ли я сгладить весь список или есть какая-то функция, касающаяся наборов, которые могут это сделать?

Спасибо!

Комментарии:

1. Не могли бы вы добавить ожидаемый результат?

Ответ №1:

Вы можете использовать a collections.Counter и предоставить ему упрощенную версию ваших данных

 from collections import Counter

values: list[list[set[str]]] = [
    [{'angular', 'java', 'sql', 'xml-schema'}, {'db2', 'docker', 'git', 'hibernate', 'jenkins', 'maven', 'rest'}],
    [{'java'}, {'maven'}],
    [{'java'}, {'oracle'}],
    [{'c  ', 'cobol', 'java', 'javascript'}, set()],
    [{'angular', 'java'}, set()],
    [{'java'}, set()]
]

language = 'java'

ocurrences = Counter([word for sublist in values for subset in sublist for word in subset])
print(ocurrences.most_common(3))  # [('java', 6), ('angular', 2), ('maven', 2)]
print(ocurrences[language])  # 6
  

Если вы хотите разделить 2 набора на language / other, сделайте это так

 ocurrences_languages = Counter([word for sublist in values for word in sublist[0]])
print(ocurrences_languages.most_common(3))  # [('java', 6), ('angular', 2), ('sql', 1)]

ocurrences_other = Counter([word for sublist in values for word in sublist[1]])
print(ocurrences_other.most_common(3))  # [('maven', 2), ('docker', 1), ('rest', 1)]
  

Ответ №2:

Если вы хотите использовать его без внешних модулей, вы можете попробовать эту функцию, которую я написал, которая будет работать с любым форматом списка, если корневой объект является строкой (изменяемой).:

 def count(list_, count_dict=dict()):
    for i in list_:
        if type(i) == str:
            if i in list(count_dict.keys()):
                count_dict[i]  = 1
            else:
                count_dict[i] = 1
        else:
            count_dict.update(count(i, count_dict))
    return count_dict
         


li = [[{'angular', 'java', 'sql', 'xml-schema'},
  {'db2', 'docker', 'git', 'hibernate', 'jenkins', 'maven', 'rest'}],
 [{'java'}, {'maven'}],
 [{'java'}, {'oracle'}],
 [{'c  ', 'cobol', 'java', 'javascript'}, set()],
 [{'angular', 'java'}, set()],
 [{'java'}, set()]]
 
print(count(li))