2016-09-19 4 views
4

Я новичок в программирование на Python, так, пожалуйста, медведь над моим новичком вопросом ...Подсчет частоты в двух списках, Python

У меня есть один первоначальный список (песни1), которые я Очищенный дубликаты и закончился (список2):

list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16 ],

песни2 = [13, 19, 2, 16, 6, 5, 20, 21]

Я хочу, чтобы подсчитать, сколько раз каждое из значений в «Ли st2 "появляется в« list1 », но я не могу понять, как это сделать, не ошибаясь.

Выход Я ищу что-то похожее на это:

Номер 13 представлен 1 раз в list1. ........ Номер 16 представлен 2 раза в списке1.

+0

Это сообщение может быть хорошим местом для начала http://stackoverflow.com/questions/2600191/how-can-i-count-the-occurrences-of-a-list-item-in-python –

ответ

6
visited = [] 
for i in list2: 
    if i not in visited: 
    print "Number", i, "is presented", list1.count(i), "times in list1" 
    visited.append(i) 
7

Самый простой способ состоит в использовании счетчика:

from collections import Counter 
list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16] 
c = Counter(list1) 
print(c) 

дает

Counter({2: 1, 5: 1, 6: 1, 13: 4, 16: 2, 19: 3, 20: 2, 21: 1}) 

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

for k, v in c.items(): 
    print('- Element {} has {} occurrences'.format(k, v)) 

даяния:

- Element 16 has 2 occurrences 
- Element 2 has 1 occurrences 
- Element 19 has 3 occurrences 
- Element 20 has 2 occurrences 
- Element 5 has 1 occurrences 
- Element 6 has 1 occurrences 
- Element 13 has 4 occurrences 
- Element 21 has 1 occurrences 
1

Простейшее, простого понять, нет магии-подход является создание объекта (ассоциативный массив) и просто подсчитывать количество в list1:

list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16] 

frequency_list = {} 

for l in list1: 
    if l in frequency_list: 
     frequency_list[l] += 1 
    else: 
     frequency_list[l] = 1 

print(frequency_list) 

печатает это:

{ 
    16: 2, 
    2: 1, 
    19: 3, 
    20: 2, 
    5: 1, 
    6: 1, 
    13: 4, 
    21: 1 
} 

значение 16 есть в два раза, 2 там один раз ...

+0

Гораздо более компактная версия состоит в том, чтобы иметь 'для элемента в списке1: frequency_list [item] = frequency_list.get (item, 0) + 1'. Я не знаю, считаете ли вы это «волшебным», но я действительно предпочитаю его для чистого кода. Я предполагаю, что это требует немного большего понимания, так что, может быть, просто вопрос мнения :) – roganjosh

+0

@roganjosh: nice. Я просто подумал, что вопрос новичков требует ответа новичков ;-) –

+1

Как интересно. Я начал использовать свое предложение, увидев его в [vid by Hettinger] (https://www.youtube.com/watch?v=OSGv2VnC0go) около отметки 24:25. Я решил проверить, и ваш подход был последовательно быстрее с разумным пределом ... – roganjosh

0

Вы также можете использовать оператор

>>> list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16], 
>>> list2 = [13, 19, 2, 16, 6, 5, 20, 21] 

>>> import operator 
>>> for s in list2: 
... print s, 'appearing in :', operator.countOf(list1, s) 
0

В техническом плане list является «тип» «объекта». Python имеет ряд встроенных типов, таких как строки (str), целые числа (int) и несколько других, которые можно легко найти в google. Причина, по которой это важно, состоит в том, что каждый тип объекта имеет свои «методы». Вы можете рассматривать эти методы как функции, которые выполняют общие задачи программирования и облегчают вашу жизнь.

Подсчет количества вхождений в списке является примером общей задачи программирования. Мы можем выполнить его с помощью метода count().Например, чтобы подсчитать количество раз 13 появляется в list1:

count_13 = list1.count(13) 

Мы можем также использовать цикл для перебора всего списка:

for x in list2: 
    print(list1.count(x)) #This is for python version 3 and up 

или питона версий старше 3:

for x in list2: 
    print list1.count(x) 
0

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

list1 = [13, 19, 13, 2, 16, 6, 5, 19, 20, 21, 20, 13, 19, 13, 16] 
counts = {s:list1.count(s) for s in list1} 
print counts 

{2: 1, 5: 1, 6: 1, 13: 4, 16: 2, 19: 3, 20: 2, 21: 1}