Python альтернатива использованию списка в качестве словарного ключа? - PullRequest
0 голосов
/ 13 января 2020

В настоящее время у меня есть словарь, который сопоставляет нормализованные оценки взаимной информации с выровненными сайтами с множественным выравниванием последовательностей, которые хранятся в списке. Однако я понял, что два списка могут иметь одинаковый счет. Таким образом, в словаре будет храниться только один список, поскольку оценка является ключевой. Кластеры должны быть уникальными, поэтому я не уверен, что делать, поскольку в моем списке нет функции ha sh.

Вот так выглядят мои данные. В идеале я просто хотел бы поменять ключи и значения.

{
0.475: [10, 11]
0.434: [12, 14]
0.404: [16, 18]
0.341: [21, 22]
}

Ответы [ 4 ]

2 голосов
/ 13 января 2020

Вы можете использовать понимание словаря здесь:

d = {0.475: [10, 11], 0.434: [12, 14], 0.404: [16, 18], 0.341: [21, 22]}
print({tuple(d[n]):n for n in d})

Вывод

{(10, 11): 0.475, (12, 14): 0.434, (16, 18): 0.404, (21, 22): 0.341}

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

Обновление

Если у вас есть дублированные списки, вы можете создать перечисление повторных списков. Вы можете сделать это так:

from collections import defaultdict
d = {0.475: [10, 11], 0.434: [12, 14], 0.404: [16, 18], 0.341: [12, 14]}
new_d = dict()
d_counts = defaultdict(int)
for n in d.keys():
    value = tuple(d[n])
    new_d[(value, d_counts[value])] = n
    d_counts[value] += 1
print(new_d)

Output2

{((10, 11), 0): 0.475, ((12, 14), 0): 0.434, ((16, 18), 0): 0.404, ((12, 14), 1): 0.341}
1 голос
/ 13 января 2020
mydict = {0.475: [10, 11],
          0.434: [12, 14],
          0.404: [16, 18],
          0.341: [21, 22]}

newdict = dict()

for k, v in mydict.items():
    newdict[tuple(v)] = k

print(newdict)
# {(10, 11): 0.475, (12, 14): 0.434, (16, 18): 0.404, (21, 22): 0.341}
0 голосов
/ 20 января 2020

Понимание словаря должно сделать это без проблем.

my_dict = {0.475: [10, 11], 0.434: [12, 14], 0.404: [16, 18], 0.341: [21, 22]}

my_dict = {my_dict[k]:k for k in my_dict}

Примечание: если вы хотите иметь if-Statement внутри него вы можете.

0 голосов
/ 13 января 2020

Из этого ответа вы можете попытаться создать новый класс из встроенного dict:

class Dictlist(dict):
    def __setitem__(self, key, value):
        try:
            self[key]
        except KeyError:
            super(Dictlist, self).__setitem__(key, [])
        self[key].append(value)

Итак ...

>>> d = Dictlist()
>>> d['100'] = [1, 2]
>>> d['100'] = [3, 4]
>>> d
{'100': [[1, 2], [3, 4]]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...