сравнивая два списка, но затем говоря, сколько раз элемент в списке соответствовал - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь сравнить winning_numbers с большим списком previous_winners, а затем подсчитать, сколько раз определенное число появилось.

winning_numbers = [20, 49, 47, 40, 36, 4, 2]
previous_winners = [
    [1, 8, 11, 25, 28, 4, 6],
    [13, 16, 34, 35, 45, 10, 12],
    [4, 5, 8, 31, 43, 2, 9],
    [2, 12, 15, 34, 50, 3, 4]
]

Я пробовал следующее

compare = set(winning_numbers) & set(previous_winners)
print(compare)

Но это дает ОШИБКУ TypeError: unhashable type: 'list', если только я не использую один список в previous_winners, который дает, например, {4, 2} НО ... как я могу подсчитать, сколько раз эти числа появилисьв списке previous_winners?

Я бы хотел закончить тем, что напечатал что-то вроде «мы сопоставляем 4, и это совпадало 8 раз» и т. д.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вы можете сгладить список previous_winners и использовать collections.Counter для подсчета количества вхождений каждого числа, так что вы можете перебрать winning_numbers, чтобы сгенерировать сопоставление выигрышных чисел с их количеством в previous_winner:

from collections import Counter
counts = Counter(n for l in previous_winners for n in l)
print({n: counts.get(n, 0) for n in winning_numbers})

Это выводит:

{20: 0, 49: 0, 47: 0, 40: 0, 36: 0, 4: 3, 2: 2}

Или, если вы хотите, чтобы числа появлялись только ранее, было бы немного эффективнее сделать winning_numbers набором вначале и производить подсчеты изprevious_winners только для тех номеров, которые есть в наборе:

from collections import Counter
winning_set = set(winning_numbers)
print(Counter(n for l in previous_winners for n in l if n in winning_set))

Это выводит:

Counter({4: 3, 2: 2})
0 голосов
/ 03 января 2019

Вы можете использовать chain.from_iterable, чтобы сгладить previous_winners и создать словарь с list comprehension и использовать .count для подсчета каждого вхождения в previous_winners:

l = list(chain.from_iterable(previous_winners))
{i:l.count(i) for i in winning_numbers}
{20: 0, 49: 0, 47: 0, 40: 0, 36: 0, 4: 3, 2: 2}
0 голосов
/ 03 января 2019

Вы можете перебирать каждый список previous_winners и вызывать пересечение множеств, затем проходить каждое пересечение compare и считать каждый раз, когда совпадение было найдено в диктовке.

matches = {}
for prev in previous_winners:
    compare = set(winning_numbers) & set(prev)
    for match in compare:
        matches[match] = matches.get(match, 0) + 1

for k, v in matches.items():
    print(k, 'occurred', v, 'times')

Выход:

4 occurred 3 times
2 occurred 2 times
...