Как выбрать наиболее встречающийся элемент при создании словаря? - PullRequest
3 голосов
/ 13 июня 2019

Я хотел создать отображение между двумя массивами. Но в python это привело к отображению с последним выбранным элементом .

array_1 = [0,0,0,1,2,3]
array_2 = [4,4,5,6,8,7]
mapping = dict(zip(array_1, array_2))
print(mapping)

Отображение привело к {0: 5, 1: 6, 2: 8, 3: 7}

Как выбрать наиболее встречающийся элемент в этом случае 4 для ключа 0.

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

Вы можете создать словарь с ключом и список значений для ключа. Затем вы можете просмотреть список значений в этом словаре и обновить значение, чтобы оно было самым частым элементом в списке, используя Counter.most_common

from collections import defaultdict, Counter

array_1 = [0,0,0,1,2,3]
array_2 = [4,4,5,6,8,7]

mapping = defaultdict(list)

#Create the mapping with a list of values
for key, value in zip(array_1, array_2):
    mapping[key].append(value)

print(mapping)
#defaultdict(<class 'list'>, {0: [4, 4, 5], 1: [6], 2: [8], 3: [7]})

res = defaultdict(int)

#Iterate over mapping and chose the most frequent element in the list, and make it the value
for key, value in mapping.items():
    #The most frequent element will be the first element of Counter.most_common
    res[key] = Counter(value).most_common(1)[0][0]

print(dict(res))

Выход будет

{0: 4, 1: 6, 2: 8, 3: 7}
2 голосов
/ 13 июня 2019

Вы можете посчитать частоты всех сопоставлений, используя Counter, а затем отсортировать эти сопоставления по ключу и частоте:

from collections import Counter

array_1 = [0,0,0,1,2,3]
array_2 = [4,4,5,6,8,7]
c = Counter(zip(array_1, array_2))
dict(i for i, _ in sorted(c.items(), key=lambda x: (x[0], x[1]), reverse=True))
# {3: 7, 2: 8, 1: 6, 0: 4}
...