Подсчет комбинаций индексов в двух списках одинаковой длины - PullRequest
0 голосов
/ 04 марта 2020

У меня есть два списка: list_a и list_b одинаковой длины. Однако длина является переменной, следующий пример является просто упрощением.

Значения в массивах также являются переменными, но я знаю, какие значения могут иметь место. Необязательные значения перечислены в options_a и options_b.

list_a = ['metro', 'metro', 'urban', 'urban', 'rural']
list_b = [1, 2, 2, 2, 3]

options_a = [1, 2, 3, 4]
options_b = ['metro', 'urban', 'suburb', 'rural']

Я хочу подсчитать вхождения option_b -опций для каждой опции в options_a и распечатать их в матрице:

[
 [1, 0, 0, 0],       #tells me that options_a=1 has the option_b='metro' exactly once
 [1, 2, 0, 0],       #options_a=2 has the option_b='metro'once, option_b='urban' twice
 [0, 0, 0, 1],       #options_a=3 has the option_b='rural' exactly once
 [0, 0, 0, 0]        #options_a=4 did not occur
]

Однако мой подход не работает, и я не знаю, как его исправить:

output = list(map(lambda x: 

                list(map(lambda y: list_a.count(y), options_b))

    , options_a))

print(output)

Результат в результате:

>>>[
    [2, 2, 0, 1],
    [2, 2, 0, 1],
    [2, 2, 0, 1],
    [2, 2, 0, 1]
   ]

1 Ответ

2 голосов
/ 04 марта 2020

Вы в настоящее время просто подсчитываете каждое слово из options_b в list_a снова и снова. Вам не хватает только для подсчета, если число в list_b совпадает с числом из options_a. Для этого вы можете использовать функцию zip(), чтобы упаковать номер слова вместе, а затем сосчитать пары:

pairs = list(zip(list_a, list_b))
output = [[pairs.count((word, num)) for word in options_b] for num in options_a]

print(output)
# [[1, 0, 0, 0], [1, 2, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0]]

Я перешел на список-комп, потому что я верю в это является более читабельным, чем использование list(map(lambda ...)) ...


Чтобы избежать повторения циклов снова и снова (count будет фактически l oop список каждый раз), вы можете использовать Counter:

from collections import Counter

pair_counts = Counter(zip(list_a, list_b))
output = [[pair_counts[(word, num)] for word in options_b] for num in options_a]

print(output)
# [[1, 0, 0, 0], [1, 2, 0, 0], [0, 0, 0, 1], [0, 0, 0, 0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...